有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java中的双向ClientServer通信

可以从socket同时读写吗?我尝试了双向客户端-服务器通信。。。但首先,我成功地将文件(字节)从客户端发送到服务器。但是,当我响应返回到服务器的文件时,出现断管错误(发生socket异常)


共 (3) 个答案

  1. # 1 楼答案

    Is it possible to simultaneously read and write from a socket?

    不,不可能用同一个插座“同时”完成。为了同时做到这一点,所有部件需要同时充当客户机和服务器,每个部件上都有一个侦听器套接字

    但阅读你的问题可能需要一个普通客户<->;当客户端发送请求,而服务器在同一个套接字中响应时,服务器通信,这在一个套接字中是可能的


    更准确地回答问题需要更准确地回答问题

    正如你所说,你的评论中有不同的问题可能会影响到你。一组讨论网络基础设施,另一组讨论编程概念,另一组讨论内存大小

    1. 关于基础架构,请确保您的服务器能够正确地看到您的客户机。如果您在本地网络中,可能没有问题,但如果服务器在另一个网络中或通过internet,则可能存在网关、路由、防火墙等问题,。。。可能导致服务器无法重新定位客户端

    2. 关于programatic,正如我之前所说,您只使用一个java套接字。这无法“同时”执行信息传输,因为只有一个通道(但java的魔力使它看起来像一个真正的并行通信)。Java将其封装在两个流“InputStream”和“OutputStream”中,这两个流看起来是“并行的”,但不是。有超过相同的I/O,您需要小心不要关闭服务器的输出流。过程可能是:

    send stream -> wait respose -> receive stream -> close streams

    1. 最后,如果您正在发送文件,则可能是在转储之前将所有数据存储到内存中。这个文件是大文件吗?如果是,可能是服务器或客户机内存不足,分配要交换的数据可能会导致管道破裂,从而隐藏真正的内存不足。在这种情况下,请尝试增加服务器使用的堆内存,或者在使用小文件(几kb)之前进行测试
  2. # 3 楼答案

    插座是双向通道。这就是为什么在每一端都有一个输入和一个输出流

    如果出现断管异常,这意味着双方中的一方(客户端或服务器)过早地关闭了流。所以这取决于谁在抱怨。如果是服务器(听起来像你的问题),那就意味着客户端写下了消息,然后关闭了它这边的所有内容。所以当服务器试图响应时,它不在那里。所以检查一下客户

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

    Server

    Client

    请注意,在准备离开while循环并完全终止其执行之前,客户端是如何从不关闭任何东西的。听起来这是你的问题。如果在这一行out.println("[" + screenName + "]: " + s);之后添加一个out.close();,则很可能会得到与当前相同的异常