在Java中处理多个TCP连接(服务器端)

在Java中处理多个TCP连接(服务器端),java,multithreading,sockets,tcp,server,Java,Multithreading,Sockets,Tcp,Server,我正在编写一个消息传递程序,我遇到了一个问题,我无法理解如何将套接字传递给一个新线程,以便通过TCP处理出站消息。我目前正在使用UDP数据包来处理从客户端发送到服务器的消息,这是UDP,不需要太多处理,因为它只是在对对象进行反序列化并在单独的线程中根据需要处理它们之前侦听传入的数据包。我现在的问题是,我正在设置一个客户端启动的TCP套接字,用于反向通信,从服务器到连接的各种客户端。我做了一些研究,我已经了解到每个客户机都应该有自己的线程来处理传出消息,还有一个线程只是用来接受传入的连接。我不确定

我正在编写一个消息传递程序,我遇到了一个问题,我无法理解如何将套接字传递给一个新线程,以便通过TCP处理出站消息。我目前正在使用UDP数据包来处理从客户端发送到服务器的消息,这是UDP,不需要太多处理,因为它只是在对对象进行反序列化并在单独的线程中根据需要处理它们之前侦听传入的数据包。我现在的问题是,我正在设置一个客户端启动的TCP套接字,用于反向通信,从服务器到连接的各种客户端。我做了一些研究,我已经了解到每个客户机都应该有自己的线程来处理传出消息,还有一个线程只是用来接受传入的连接。我不确定如何真正做到这一点,我已经对这个话题做了一些研究

我发现:

上面的资源基本上验证了我最初的怀疑,即这必须由专用于客户端的线程来处理。这里包括psuedo代码,它代表我的侦听器线程

while (true) {
    accept a connection;
    create a thread to deal with the client;
}
我是一个有点视觉学习的人,我一直在寻找某种类型的例子。我不确定要传递给线程的变量是什么,该线程保持原始连接打开,并将数据推回客户端。我也有点难以理解它是否保持同一个套接字打开,或者是否需要建立一个新的套接字,这让我相信防火墙可能会干扰,但我知道情况并非如此

有人能给我详细解释一下吗?如果可能,请举个例子


我可能会在发布后15-30分钟内回复和评论回复

你所做的听起来是正确的。我通常实现这样的服务器(简化版,不跟踪客户机等):

其中serverSocket是一个serverSocket实例变量,stopped是一个用于停止侦听器线程的标志

因此,为了回答您在评论中的问题,您通常将套接字对象传递给每个客户机线程,以便该线程可以处理输入和输出流,并处理套接字的关闭等。“接受”套接字连接后,不需要重新创建ServerSocket,只需再次调用
.accept()
即可开始等待新连接


在大多数情况下,您需要跟踪服务器中的所有客户端线程,以便能够正常停止服务器或进行广播等操作。

到处都有大量的示例。从Oracle Java教程的自定义网络部分开始。如果我错了,请纠正我,但这不是我刚才在问题中发布的资源吗?我一直在寻找像教程这样的东西,我所发现的只是简单的1对1交流,就像1对多交流一样。另外,我包含的代码块来自于同一个教程。我请求帮助理解如何实现这一点,在创建此问题之前,我已经完成了您所说的内容。感谢您为我澄清这一点。出于某种原因,我觉得不能只将套接字的一个实例传递给另一个线程,与其他线程重新建立新的连接,然后让另一个线程正常工作。我也不知道如何正确地通过考试。
@Override
public void run() {
    //start listening on the port
    try {
        serverSocket = new ServerSocket(port);
        logger.info("Listening for connections on port " + port);
    } catch (IOException e) {
        logger.error("Cannot start SocketListener on port " + port + ". Stopping.", e);
        return;
    }

    while (!stopped) {
        try {
            //wait for connection
            Socket newSocket = serverSocket.accept();
            ClientThread client = new ClientThread(newSocket);
            Thread clientThread = new Thread(client, MEANINGFUL_THREAD_ID);
            clientThread.start();
        } catch ...
    }
}