如何处理来自同一IP的多个连接?

时间:2013-12-05 19:18:35

标签: java sockets networking

所以,我有以下代码捕获一个新连接,然后将该连接交给它自己的线程来处理客户端。

    private void loop(int port) {
        // Opens a port for connections.
    ServerSocket serverSocket = null;
    try {
        serverSocket = new ServerSocket(port);
        System.out.println("Server running in port " + port);
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

        // Listens for a connection
    while (onlineState == true && serverSocket != null) {
        Socket clientSocket = new Socket();

            try {

                clientSocket = serverSocket.accept();
                System.out.println(clientSocket.getInetAddress() + " has connected to the port " + clientSocket.getPort());

                new Thread(new SocketThread(clientSocket)).run();

                clientSocket.close();

            } catch (IOException e) {
                e.printStackTrace();
            }
    }

所以,我的问题是当我尝试将多个客户端应用程序连接到服务器时,服务器似乎只在任何给定时间接受一个连接。客户端本身是基本教程的一个非常简单的应用程序:它只是重复服务器发送给它的任何字符串。

我有两个猜测,为什么会发生这种情况:a)我的处理代码有问题,b)因为两个连接来自同一个IP。

但是,这两种情况都不是好事。我有什么想法我做错了吗? (除了一切)

1 个答案:

答案 0 :(得分:1)

两件事:

  1. 您想在start()对象上拨打run(),而不是Thread。不同之处在于start()实际上是并且做了线程化的东西,比如在后台运行它。从您调用它的地方调用run()将在那里处理内联的所有客户端通信。这就是为什么你只接受一个连接 - 在你为那个客户提供服务之前你不会再接受了。

  2. 您不想在主线程中调用clientSocket.close()。在SocketThread的实施中,请在clientSocket.close()方法的末尾调用run(),可能在finally块内。

  3. 此外,SocketThread是否会延长Thread?如果是这样,您不需要new Thread(),只需执行

    new SocketThread(clientSocket).start();
    

    如果不展开Thread,为什么不将其命名为SocketRunnableClientRunnable或类似名称。