java中TCP服务器和客户端之间的四路消息交换

java中TCP服务器和客户端之间的四路消息交换,java,tcpclient,Java,Tcpclient,我试图在TCP客户机和服务器之间实现一个四路消息交换,其中服务器首先发送消息,从客户机接收回复,然后再次执行相同的操作。这可以扩展到更多的消息。如何保持两者之间的连接打开?如果应该有一个无限的while循环,它应该放在哪里?我在客户端尝试了这个,但出现了一个错误。我不关心这里的服务器 // open socket while(true) { // read // send reply } clientSocket.close(); 问题是,对于服务器发送的同一消息,缓冲区被读取了两次,然后

我试图在TCP客户机和服务器之间实现一个四路消息交换,其中服务器首先发送消息,从客户机接收回复,然后再次执行相同的操作。这可以扩展到更多的消息。如何保持两者之间的连接打开?如果应该有一个无限的while循环,它应该放在哪里?我在客户端尝试了这个,但出现了一个错误。我不关心这里的服务器

// open socket

while(true) {
// read
// send reply
}

clientSocket.close();
问题是,对于服务器发送的同一消息,缓冲区被读取了两次,然后出现以下错误:

Exception in thread "main" java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at java.io.DataOutputStream.write(Unknown Source)
at java.io.FilterOutputStream.write(Unknown Source)
at TCPClient.main(TCPClient.java:52)

显然,这不是TCP服务器握手,而是特定于应用程序的第7层握手。连接插座时,已执行三向握手,且插座已连接。除此之外,您所做的只是以可靠的方式简单地交换数据

回到您的问题,抛出的异常清楚地表明您无法写入套接字服务器

为什么??可能有多种原因:

套接字服务器的运行方式不正确。 您没有写入套接字服务器,例如,在第一次写入之后,在循环中,您可能会丢失对套接字对象的跟踪,并写入空对象,等等。
因此,请详细说明或自己试一试,祝你好运。

显示使用这些函数的代码。相信你会意识到,如果闭合在循环之前,则打开应该在循环之前?EJP是的,当然!它在while循环之前。问题是,即使缓冲区处理过一次,也会再次读取!如何清空缓冲区或告诉代码没有收到新消息,循环现在应该退出?握手通常指建立连接。TCP握手SYN、SYN-ACK、ACK由Java的open和accept方法执行。一旦你来回传递信息,握手就完成了。我所说的握手是指数据交换。。。标题可能有误导性,但我想这个问题解释了问题所在!