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

标签 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,我这样做了错误的?谢谢。

最佳答案

ServerSockets 正在寻找新的套接字连接,并阻止给定端口。如果您想要多个服务器套接字,请使用多个端口。如果您希望在不同的套接字上使用多个线程,请使用一个服务器套接字,并让一个线程在创建后执行该工作。接受只是等待创建一个,请参阅此处了解套接字的良好基本介绍:http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html

关于java - 为什么我不能在 Java 中使用两个线程持有同一个套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9882158/

相关文章:

java - 如何解决缺少包访问说明符的问题?

java - 替换树状图中特定键的值会更改每个键的值

python - ToasterBox 的问题,你能 join() 一个计时器或强制一个线程等待计时器在 python 中完成吗

objective-c - NSInputStream 不调用委托(delegate)(流 :handleEvent:)

java - 从应用程序发送带有附件的电子邮件

java - 从names.nsf目录中检索拒绝访问组成员

java - 使用 wait() 时的同步方法

java - ThreadPoolExecutor中的 "active threads"是什么意思?

node.js - Nodejs setNoDelay() 不起作用。是否有刷新套接字缓冲区的替代方案?

java - Java中套接字的有效使用