Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用TCP处理多线程_Java_Sockets_Tcp_Network Programming_Chat - Fatal编程技术网

Java 使用TCP处理多线程

Java 使用TCP处理多线程,java,sockets,tcp,network-programming,chat,Java,Sockets,Tcp,Network Programming,Chat,我正在尝试实现一个聊天应用程序,在设计上可以选择使用TCP或UDP进行对等方之间的消息交换。我想使用TCP,但有以下问题 问题场景: 对等方A正在侦听一个已知端口(比如5555)。当对等方B想要向对等方A发送消息时,它连接到A上的端口5555。对等方A接受该连接并启动一个新线程来处理与对等方B的通信,以便其他对等方(比如对等方C)能够连接到对等方A的5555端口。现在的问题是,它不是一个请求/响应协议,所以我很困惑,如果对等方a出于任何原因不回复对等方B,那么B发送的后续消息将被传递到对等方a上

我正在尝试实现一个聊天应用程序,在设计上可以选择使用TCP或UDP进行对等方之间的消息交换。我想使用TCP,但有以下问题

问题场景: 对等方A正在侦听一个已知端口(比如5555)。当对等方B想要向对等方A发送消息时,它连接到A上的端口5555。对等方A接受该连接并启动一个新线程来处理与对等方B的通信,以便其他对等方(比如对等方C)能够连接到对等方A的5555端口。现在的问题是,它不是一个请求/响应协议,所以我很困惑,如果对等方a出于任何原因不回复对等方B,那么B发送的后续消息将被传递到对等方a上的端口5555?对等A将为收到的每条消息创建单独的线程


使用UDP可能会解决这个问题,我不必创建单独的线程与每个对等方通信,每个人都可以将消息发送到同一个众所周知的端口。但是我想使用TCP来保证消息的传递。你知道什么是处理这个问题的好方法,并且只使用一个线程与一个对等方进行通信吗?

你所描述的问题不会发生,因为TCP是一个“连接”的协议,这基本上意味着两个对等方必须在发生任何其他事情之前协商通信。然后,TCP控制数据包的顺序,以确保它们以正确的顺序到达目的地。顺便说一句,TCP代表传输控制协议,所以它非常强调确保您所描述的不会发生。UDP完全不是这样

一旦您的
ServerSocket
接受了来自客户端
Socket
的连接,协商就完成了,TCP流专用于该通信

创建新连接的唯一方法是客户端通过新套接字发出另一个连接


但说服自己的最好方法是将日志添加到应用程序中,然后自己尝试。

您描述的问题不会发生,因为TCP是一种“连接”协议,这基本上意味着两个对等方必须在发生任何其他事情之前协商通信。然后,TCP控制数据包的顺序,以确保它们以正确的顺序到达目的地。顺便说一句,TCP代表传输控制协议,所以它非常强调确保您所描述的不会发生。UDP完全不是这样

一旦您的
ServerSocket
接受了来自客户端
Socket
的连接,协商就完成了,TCP流专用于该通信

创建新连接的唯一方法是客户端通过新套接字发出另一个连接

但说服自己的最好方法是将日志添加到应用程序中,然后自己尝试。

您混淆了监听、服务器、套接字和连接的套接字

一旦侦听端接受TCP连接,双方之间就有了一个全新的全双工套接字,这样他们就可以交换数据了。侦听套接字的唯一用途是接受连接,没有应用程序数据流经这些连接

您可以将新连接的套接字交给一个线程,但您当然不必这样做-您可以在一个线程中处理许多非阻塞套接字,我相信Java NIO包正是为此而创建的。

您混淆了侦听、服务器、套接字和连接的套接字

一旦侦听端接受TCP连接,双方之间就有了一个全新的全双工套接字,这样他们就可以交换数据了。侦听套接字的唯一用途是接受连接,没有应用程序数据流经这些连接


您可以将新连接的套接字交给一个线程,但您当然不必这样做-您可以在一个线程中处理许多非阻塞套接字,我相信Java NIO包正是为此而创建的。

+1。此外,serverSocket应该只侦听预定义端口上的传入连接;对等方之间的所有进一步通信将在随机(但预先安排的)端口上完成。@Shark否。在服务器端,接受的套接字使用与侦听套接字相同的本地端口。也不需要预先安排。关于ServerSocket应该做什么的部分甚至没有意义,因为它肯定不能做任何其他事情。+1。此外,serverSocket应该只侦听预定义端口上的传入连接;对等方之间的所有进一步通信将在随机(但预先安排的)端口上完成。@Shark否。在服务器端,接受的套接字使用与侦听套接字相同的本地端口。也不需要预先安排。关于ServerSocket应该做什么的部分甚至没有意义,因为它肯定不能做任何其他事情。