JAVA TCP 服务端需要等到客户端关闭之后才能后台打印发送数据。

启动TCP服务端之后,我用TCP助手连接TCP客户端,想该服务端发送数据。发现后台打印不出来。然后关闭TCP助手的客户端之后,服务端打印出刚才客户端发送的信息。我单步调试... 启动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();
}
}
}
}
展开
 我来答
风吹草动云飞扬
推荐于2018-03-29
知道答主
回答量:12
采纳率:0%
帮助的人:4万
展开全部
JavaTCP服务端 与 TCP客户端(Java写的 C写的 ...) 通讯 会等到客户端说 我要关闭了(数据数据数据数据数据/n) 然后服务端才会往下进行 (服务端才打印接收到的信息 以及数据库等后续操作)
所以 客户端 发送的信息 一定要以/n 或者/r/n结尾
否则 服务端会一直等待客户端发送数据
血泪之谈
jamxval
2013-11-13 · TA获得超过6821个赞
知道大有可为答主
回答量:4308
采纳率:82%
帮助的人:1372万
展开全部
这是因为你的服务端是先读取客户端数据,因为这个Socket InputStream 是阻塞的。因为 socket 是全双工的,所以我们应该:
1、当我们使用同步的 I/O 我们就得用双线程,一个负责读取,读取后处理并把回复放入“出站队列”;另一个线程就是从”出站队列“中读取"回复”并写出。
2、当我们使用异步的 I/O 时我们不需要多线程,不过流程略有不同。可以百度/google 一下 Java NIO 中关于 ServerSocketChannel 和 SocketChannel 的样例。

http://docs.oracle.com/javase/1.4.2/docs/guide/nio/example/
http://docs.oracle.com/javase/7/docs/technotes/guides/io/example/
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
rong2b
2013-11-13 · TA获得超过173个赞
知道小有建树答主
回答量:216
采纳率:50%
帮助的人:130万
展开全部

原因猜测如下:

  1. 客户端写的数据太小,缓冲区没刷新,服务端未接受到数据;

  2. 客户端写完一定的数据量后没flush,所有的数据都在缓冲区中。

你可以试试~


  1. 客户端写一定的数据flush一下;

  2. 或者客户端写完一定的数据加入结束标志。

更多追问追答
追问
但是我用的是套接字助手啊。不是我自己写的客户端。应该不存在这个flush的问题吧?
追答
因为你关闭了助手之后,就会打印出来,所以才这么说的,你看下这个助手有没有发送功能~ 要不你别用Reader了 ,直接用Stream看能否打印出二进制~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式