java中的双向ClientServer通信

时间:2015-10-08 09:57:33

标签: java

是否可以同时从套接字读取和写入?我尝试了双向客户端服务器通信......但事情是我首先将文件(字节)从客户端发送到服务器成功接收。但是当我回复时服务器发生故障管道错误(发生套接字异常)的文件

3 个答案:

答案 0 :(得分:1)

套接字双向通道。这就是为什么每端都有输入和输出流的原因。

如果您遇到损坏的管道异常,则意味着双方中的一方(客户端或服务器)过早地关闭了流。所以这取决于谁在抱怨。如果它是服务器(听起来像你的问题),那么它意味着客户端编写了它的消息,然后关闭了它的一切。因此,当服务器尝试响应时,它不在那里。所以检查一下客户。

为了帮助您,这是一个非常基本的客户端/服务器实现示例:

Server

Client

注意客户端在准备离开function getHiddenRFIDValue(stringValue) { document.getElementById('hiddenRFIDValue').innerHTML = stringValue; } 循环并完全终止执行之前永远不会关闭任何内容。听起来这是你的问题。如果在此行while之后添加了out.println("[" + screenName + "]: " + s);,您可能会得到同样的异常。

答案 1 :(得分:0)

  

是否可以同时从套接字读取和写入?

不,它不可能同时做到"同时"使用相同的插座。要同时执行此操作,部件需要同时充当客户端和服务器,每个部件上都有一个侦听器套接字。

但是,在客户端发送请求并且服务器在同一个套接字中响应时,阅读您的问题可能需要一个公共客户端< - >服务器通信,这可以通过一个套接字实现。

更准确地说,响应需要更准确地解决问题。

正如您所说的那样,可能会产生不同的问题。一组涉及网络基础设施,其他涉及程序设计概念,另一组涉及内存大小调整

  1. 关于基础架构,请确保您的服务器能够正确查看您的客户端。如果你在本地网络可能没有问题,但如果服务器在另一个网络或互联网上,可能是网关,路由,防火墙等问题可能导致服务器无法找回客户端。

  2. 关于programatic,正如我之前所说的,你只使用一个java套接字。这无法同时执行"信息传递只有一个通道(但java的魔力使它看起来像一个真正的并行通信)。 Java将它封装在两个流中,并且#34; InputStream"和" OutputStream"这似乎是" parallel"但不是。有相同的I / O,你需要小心不要关闭到服务器的输出流。过程应该是:

  3.   

    发送流 - >等待respose - >接收流 - >关闭溪流

    1. 最后,如果您要发送文件,可能是在转储之前将所有数据存储在服务器中。该文件是一个大文件?如果是,可能是服务器或客户端内存不足,分配要互换的数据可能会导致管道损坏,导致实际内存不足。在这种情况下,尝试增加服务器使用的堆内存或使用小文件(几kb)进行测试。

答案 2 :(得分:0)

既不关闭套接字也不关闭输出流。你在客户端做一个shutdownOutput()。使用outputstream.shutdownOutput();在客户端发送函数后对此行进行编码。参考This is half closed socket function for bidirectional communication