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

时间:2014-11-06 21:30:41

标签: java multithreading sockets tcp server

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

我发现了这个:http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html

上面的资源基本上证实了我原先的怀疑,即这必须由专用于客户端的线程来处理。它们包括伪代码,它代表我的监听器线程。

while (true) {
    accept a connection;
    create a thread to deal with the client;
}

我是一个视觉学习者,我一直在寻找某种类型的例子。我不确定我将传递给保持原始连接打开的线程的变量,并将数据推送回客户端。我也有一点麻烦,抓住它是否保持相同的插座打开,或者是否需要建立新的插座,这使我相信防火墙可能会干扰,但我知道这不会是案件。

有人能详细解释一下吗?如果可能的话,将非常感谢一个例子!

我可能会在发布此约15-30分钟后回复并评论回复。

1 个答案:

答案 0 :(得分:2)

你在做什么听起来是对的。我通常实现这样的服务器(没有跟踪客户端的简化版本等):

@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 ...
    }
}

其中serverSocket是ServerSocket实例变量,stopped是我用来停止侦听器线程的标志。

因此,要在注释中回答您的问题,通常会将Socket对象传递给每个客户端线程,以便该线程可以使用输入和输出流并处理套接字的关闭等等。一旦你接受"套接字连接,您不需要重新创建ServerSocket,只需再次调用.accept()即可开始等待新连接。

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