gpt4 book ai didi

Java套接字线程问题

转载 作者:行者123 更新时间:2023-12-01 16:07:38 24 4
gpt4 key购买 nike

我正在构建一个 java 应用程序,它同时监听 2 个端口,并且还能够进行多线程处理。我的做法如下。我在 PortApp.java 中有一个非常基本的 GUI,它通过 2 个文本字段接收 2 个整数,并且还有一个监听按钮。因此,当单击监听按钮时,将执行以下代码。

jTextField1.disable();                    

jTextField2.disable();

int port = Integer.valueOf(jTextField1.getText());
int port1 =Integer.valueOf(jTextField2.getText());
int count = 0;

try{

foo(port,port1);
while (true) {
//Socket connection = socket1.accept();

thread.start();
thread1.start();
}
}


catch (Exception e) {}

而方法foo()如下

public void foo(int a, int b){   //function to get the port numbers as integers and to declare 2 sockets for the ports.
int port=a;
int port1=b;
int count=0;

try {
socket1 = new ServerSocket(port);
} catch (IOException ex) {

}

try {
socket2 = new ServerSocket(port1);
} catch (IOException ex) {

}
//System.out.println("MultipleSocketServer Initialized");
Runnable runnable = new MultipleSocketServer(socket1, ++count);
Runnable run = new MultipleSocketServer(socket2, ++count);
thread = new Thread(runnable);
thread1 = new Thread(run);
}

其中socket1和socket2是ServerSocket实例。然后,控制权转移到另一个类 MultipleSocketServer,一旦建立了套接字,该类又会执行其他后端工作。

MultipleSocketServer类的run()如下

public void run() {
while(true){


try {

Socket incoming=connection.accept();
BufferedInputStream is = new BufferedInputStream(incoming.getInputStream());
int character;
while((character = is.read())!=-1) {

//DO SOMETHING
}
incoming.close();
SYstem.out.println("Client DC'ed");
//CONTINUE WITH OTHER EXECUTIONS
}

MultipleSocketServer 的构造函数是

MultipleSocketServer(ServerSocket s, int i) {
this.connection = s;
this.ID = i;
}

现在上面的监听器代码确实支持同时多个客户端。我认为每当“同一端口上的多个同时连接”客户端中的任何一个断开连接时,它都会并且应该打印“cient DC”提示消息,但这似乎不会发生,直到最后一个客户端连接到该端口实例,一旦该客户端断开连接,就会打印出所有客户端的提示消息。因此,本质上,即使任何特定客户端断开连接,直到最后一个客户端断开连接时,才会打印与该客户端对应的提示消息,从而使套接字“空闲”。任何有关如何解决此问题并在任何同时连接的客户端断开连接时打印出提示而不等待所有客户端断开连接的指示都会有很大帮助。

仅供引用,我正在使用多个 super 终端实例模拟上述环境。

干杯

最佳答案

while (true) {
//Socket connection = socket1.accept();

thread.start();
thread1.start();
}
}


catch (Exception e) {}

不要捕获并吞掉所有异常。另外,如果线程遇到未处理的异常,它就会死亡。您不会在 while 循环中捕获线程异常。
您不能重用线程对象。一旦 run() 方法完成,您就无法再次调用 start()。您必须创建一个新线程(如果有意义的话,可能使用相同的可运行线程)。您还可以通过使变量名称具有描述性来改进它们。

关于Java套接字线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2287463/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com