关于socket的问题,网络传输

诺克提斯-伽拉姆 2014-05-30 10:45:47
写了段网络编程代码,结果出现了很奇怪的问题。
客户端一次请求得到2次回复,第二次回复为4个空字节,而服务器确实只flush了一次。
而且,客户端打印服务端回复,只打印了一半,后半段要再请求一次才能打印出来。
以下是代码,求大神解答

客户端:

package server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Client {
private static Socket socket;
/**
* @param args
* @throws IOException
* @throws UnknownHostException
* @throws InterruptedException
*/
public static void main(String[] args) throws UnknownHostException, IOException, InterruptedException {
socket=new Socket("localhost",8999);
System.out.println("连接服务端成功");
PrintWriter ow = new PrintWriter(socket.getOutputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
Scanner scan=new Scanner(System.in);
String str;
while(true){
char[] buf=new char[1024];
System.out.println("请输入请求:");
str=scan.next().trim();
if(str.equals("quit"))
break;
System.out.println("发送请求");
ow.write(str);
ow.flush();
System.out.println("等待服务端回复");
StringBuffer sb=new StringBuffer();
int rd=0;
if((rd=br.read(buf))>0){
for(int j=0;j<rd;j++)
{sb.append(buf[j]);
}
System.out.println("=============="+sb.toString()+"=============");
}
}
ow.close();
br.close();
socket.close();

}

}


服务端:

package server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class Server {
private static ServerSocket server;
private static ArrayList<Thread> threadGroup = new ArrayList<Thread>();

/**
* @param args
* @throws IOException
* @throws InterruptedException
*/
public static void main(String[] args) throws IOException,
InterruptedException {
server = new ServerSocket();
server.setReuseAddress(true);
server.bind(new InetSocketAddress(8999));
Socket client;
while (true) {
System.out.println("等待客户端的连接~~");
client = server.accept();
Child child = new Server().new Child(client);
Thread thread = new Thread(child);
thread.start();
System.out.println("连接成功~~~");
threadGroup.add(thread);
child.setGroup(threadGroup);
while (threadGroup.size() > 4) {
Thread.sleep(1000);
}
if (threadGroup.size() == 0)
break;
}
server.close();
}

private class Child implements Runnable {
Socket client = null;
ArrayList<Thread> group = new ArrayList<Thread>();

public Child(Socket client) {
this.client = client;
}

public void setGroup(ArrayList<Thread> threadGroup) {
this.group = threadGroup;
}

@Override
public void run() {
BufferedReader br = null;
PrintWriter ow = null;
try {
ow = new PrintWriter(client.getOutputStream());
br = new BufferedReader(new InputStreamReader(
client.getInputStream()));
char[] buf = new char[1024];
int i = 0;
while (true) {
if (i == 4) {
ow.write("您已达到最大访问次数");
break;
}
i++;
System.out.println(i + "等待客户端请求");
int rd=0;
try {
rd = br.read(buf);
} catch (Exception e) {
System.out.println(client.getInetAddress());
br.close();
ow.close();
group.remove(this);
client.close();
return;
}
ow.write("服务回应" + buf[0]);
for (int j = 1; j < buf.length; j++) {
ow.append(buf[j]);
}
ow.flush();
}
br.close();
ow.close();
group.remove(this);
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
...全文
178 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangdayenihao 2014-06-03
  • 打赏
  • 举报
回复
楼主,我把你的代码调了半天发现的问题,和你说的Scanner没有什么关系啊~!
  • 打赏
  • 举报
回复
求大神? 就2个类,可以直接复制黏贴到eclipse上试试
  • 打赏
  • 举报
回复
谢谢大家的回复,我找到问题了: 是因为输入流的问题, Scanner从控制台输入,貌似会传送额外的数据
  • 打赏
  • 举报
回复
引用 4 楼 lsongiu8612 的回复:
服务端返回的char[]长度为4+1024,客户端接收的时候的buff为1024大小的,所以一次读不完
实际数据只有几个字节,把服务端的字符数组设置为100大小,客户端设置为1024 照样读不完 如果全部读完数据(while(br.read>-1)),显示如下:返回2个一样的数据,但后者比前者多了4个空字节。不解。。。 ==========服务回应:das ===================== ==========服务回应:das ===================== 好神奇
wangdayenihao 2014-05-30
  • 打赏
  • 举报
回复
ow = new PrintWriter(client.getOutputStream()); br = new BufferedReader(new InputStreamReader(client.getInputStream())); 这两句要放在while(true){ 里面},客户端和服务端的都是 ow.write("您已达到最大访问次数");后加上ow.flush();
lsongiu8612 2014-05-30
  • 打赏
  • 举报
回复
服务端返回的char[]长度为4+1024,客户端接收的时候的buff为1024大小的,所以一次读不完
  • 打赏
  • 举报
回复
引用 2 楼 jacky4631 的回复:
               while (true) {
                    if (i == 4) {
                        ow.write("您已达到最大访问次数");
                        break;
                    }
                    i++;
可能是这边的问题,你怎么知道它读到终点了呢,现在的情况是只执行4次循环程序就中断了
不是这个问题,在第四次访问时才会进入这里,然后中断连接。前几次没进这里。 现在的情况是,客户端发送一个请求,服务端返回2个请求,第二个请求是4个空字节,不知道哪来的
忘了隐藏 2014-05-30
  • 打赏
  • 举报
回复
               while (true) {
                    if (i == 4) {
                        ow.write("您已达到最大访问次数");
                        break;
                    }
                    i++;
可能是这边的问题,你怎么知道它读到终点了呢,现在的情况是只执行4次循环程序就中断了

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧