为什么我不能在Java中使用两个持有相同套接字的线程?

时间:2012-03-27 01:23:12

标签: java multithreading sockets

以下是代码:

TaskA a = new TaskA(this.serverSocket, this.socket);
a.assignConfig(this.config);
this.threada = new Thread(a);
this.threada.start();

TaskB b = new TaskB(this.serverSocket, this.socket);
b.assignConfig(this.config);
this.threadb = new Thread(b);
this.threadb.start();

在TaskA中,这个类的工作原理如下:

        if (this.serversocket == null) {
            this.serversocket = new ServerSocket(this.config.getI_respondPort());
        }

        if (this.serversocket != null) {
            System.out
                    .println("this.serversocket " + this.serversocket);
        }

        this.serversocket.setSoTimeout((int) this.config
                .getL_respondSocketInterval());

        while (this.is_keepRun()) {
                System.out.println("Keep Listening");

                Thread.sleep(this.config.getL_heartBeatInterval());
        }

TaskB是这样的:

    while (this.is_keepRun()) {

            if (this.serversocket != null) {
                System.out.println("waiting input");

                this.socket = this.serversocket.accept();

                System.out.println("Connection received from "
                        + this.socket.getInetAddress().getHostName());
            }

    }

我通过自己的构造函数分配相同的serverSocket和socket,但是当socket得到连接时,TaskA可以执行serversocket.accept,但TaskB的serversocket总是为null,wt我做错了吗?感谢。

1 个答案:

答案 0 :(得分:2)

ServerSockets正在寻找新的套接字连接,并在给定端口上阻塞。如果您希望多个服务器套接字使用多个端口。如果你想在各种套接字上使用多个线程,那么使用一个服务器套接字,并在创建后有一个线程来完成工作。接受只是等待创建一个,请参阅此处以获得有关套接字的良好基本介绍:http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html