java中的双向ClientServer通信 1 月,2 周 Questions & Answers 4118 可以从socket同时读写吗?我尝试了双向客户端-服务器通信。。。但首先,我成功地将文件(字节)从客户端发送到服务器。但是,当我响应返回到服务器的文件时,出现断管错误(发生socket异常)
# 1 楼答案 Is it possible to simultaneously read and write from a socket? 不,不可能用同一个插座“同时”完成。为了同时做到这一点,所有部件需要同时充当客户机和服务器,每个部件上都有一个侦听器套接字 但阅读你的问题可能需要一个普通客户<->;当客户端发送请求,而服务器在同一个套接字中响应时,服务器通信,这在一个套接字中是可能的 更准确地回答问题需要更准确地回答问题罢工> 正如你所说,你的评论中有不同的问题可能会影响到你。一组讨论网络基础设施,另一组讨论编程概念,另一组讨论内存大小 关于基础架构,请确保您的服务器能够正确地看到您的客户机。如果您在本地网络中,可能没有问题,但如果服务器在另一个网络中或通过internet,则可能存在网关、路由、防火墙等问题,。。。可能导致服务器无法重新定位客户端 关于programatic,正如我之前所说,您只使用一个java套接字。这无法“同时”执行信息传输,因为只有一个通道(但java的魔力使它看起来像一个真正的并行通信)。Java将其封装在两个流“InputStream”和“OutputStream”中,这两个流看起来是“并行的”,但不是。有超过相同的I/O,您需要小心不要关闭服务器的输出流。过程可能是: send stream -> wait respose -> receive stream -> close streams 最后,如果您正在发送文件,则可能是在转储之前将所有数据存储到内存中。这个文件是大文件吗?如果是,可能是服务器或客户机内存不足,分配要交换的数据可能会导致管道破裂,从而隐藏真正的内存不足。在这种情况下,请尝试增加服务器使用的堆内存,或者在使用小文件(几kb)之前进行测试李>
# 2 楼答案 您既不关闭套接字也不关闭outputstream。在客户端执行shutdownOutput()。使用outputstream。关机输出();在客户端的send函数之后编写这行代码。参考This is half closed socket function for bidirectional communication
# 3 楼答案 插座是双向通道。这就是为什么在每一端都有一个输入和一个输出流 如果出现断管异常,这意味着双方中的一方(客户端或服务器)过早地关闭了流。所以这取决于谁在抱怨。如果是服务器(听起来像你的问题),那就意味着客户端写下了消息,然后关闭了它这边的所有内容。所以当服务器试图响应时,它不在那里。所以检查一下客户 为了帮助您,下面是一个非常基本的客户机/服务器实现示例: Server Client 请注意,在准备离开while循环并完全终止其执行之前,客户端是如何从不关闭任何东西的。听起来这是你的问题。如果在这一行out.println("[" + screenName + "]: " + s);之后添加一个out.close();,则很可能会得到与当前相同的异常
# 1 楼答案
不,不可能用同一个插座“同时”完成。为了同时做到这一点,所有部件需要同时充当客户机和服务器,每个部件上都有一个侦听器套接字
但阅读你的问题可能需要一个普通客户<->;当客户端发送请求,而服务器在同一个套接字中响应时,服务器通信,这在一个套接字中是可能的
更准确地回答问题需要更准确地回答问题罢工>正如你所说,你的评论中有不同的问题可能会影响到你。一组讨论网络基础设施,另一组讨论编程概念,另一组讨论内存大小
关于基础架构,请确保您的服务器能够正确地看到您的客户机。如果您在本地网络中,可能没有问题,但如果服务器在另一个网络中或通过internet,则可能存在网关、路由、防火墙等问题,。。。可能导致服务器无法重新定位客户端
关于programatic,正如我之前所说,您只使用一个java套接字。这无法“同时”执行信息传输,因为只有一个通道(但java的魔力使它看起来像一个真正的并行通信)。Java将其封装在两个流“InputStream”和“OutputStream”中,这两个流看起来是“并行的”,但不是。有超过相同的I/O,您需要小心不要关闭服务器的输出流。过程可能是:
# 2 楼答案
您既不关闭套接字也不关闭outputstream。在客户端执行shutdownOutput()。使用outputstream。关机输出();在客户端的send函数之后编写这行代码。参考This is half closed socket function for bidirectional communication
# 3 楼答案
插座是双向通道。这就是为什么在每一端都有一个输入和一个输出流
如果出现断管异常,这意味着双方中的一方(客户端或服务器)过早地关闭了流。所以这取决于谁在抱怨。如果是服务器(听起来像你的问题),那就意味着客户端写下了消息,然后关闭了它这边的所有内容。所以当服务器试图响应时,它不在那里。所以检查一下客户
为了帮助您,下面是一个非常基本的客户机/服务器实现示例:
Server
Client
请注意,在准备离开
while
循环并完全终止其执行之前,客户端是如何从不关闭任何东西的。听起来这是你的问题。如果在这一行out.println("[" + screenName + "]: " + s);
之后添加一个out.close();
,则很可能会得到与当前相同的异常