启动TCP服务端之后,我用TCP助手连接TCP客户端,想该服务端发送数据。发现后台打印不出来。然后关闭TCP助手的客户端之后,服务端打印出刚才客户端发送的信息。我单步调试之后,发现函数在while ((msg = br .readLine()) != null)之后停滞不前。等关闭客户端之后,程序才前进到System.out.println(msg); 请问这个是什么原因?怎么修改呢?读数据和处理部分代码如下:
//读数据方法
private BufferedReader getReader(Socket socket)throws IOException{
InputStream socketIn = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(socketIn);
return new BufferedReader(isr);
}
//接受处理
public void run() {
System.out.println("一个新的连接 " +
socket.getInetAddress() + ":" +socket.getPort());
try {
BufferedReader br =getReader(socket);
// PrintWriter pw = getWriter(socket);
String msg = null;
// byte[] b = new byte[100];
while ((msg = br .readLine()) != null) { //接收和发送数据,直到通信结束
System.out.println(msg);
// pw .println(echo(msg));
if (msg.equals("bye"))
break;
}
} catch (IOException e) {
}finally{
if (socket!=null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
原因猜测如下:
客户端写的数据太小,缓冲区没刷新,服务端未接受到数据;
客户端写完一定的数据量后没flush,所有的数据都在缓冲区中。
你可以试试~
客户端写一定的数据flush一下;
或者客户端写完一定的数据加入结束标志。
但是我用的是套接字助手啊。不是我自己写的客户端。应该不存在这个flush的问题吧?
追答因为你关闭了助手之后,就会打印出来,所以才这么说的,你看下这个助手有没有发送功能~ 要不你别用Reader了 ,直接用Stream看能否打印出二进制~
追问助手应该没问题的。我也是在想是不是BufferedReader 的问题。还有在麻烦你一下,如果我写成接受16进制数据的话,用什么比较好??
追答不管你怎么写,底层都是二进制的,所以不是用什么好,而是转换。
追问那能不能帮我写一下接受16进制的程序?我试了半天没弄明白。。