我正在构建一个同时侦听2个端口的java应用程序,并且还能够进行多线程处理。 我是如何做到这一点的如下。我在PortApp.java中有一个非常基本的GUI,它通过2个文本字段获取2个整数,并且还有一个监听按钮。因此,当单击listen按钮时,将执行以下代码。
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'的提示信息',但这似乎不会发生,它不打印出提示,直到最后一个客户端连接到该端口实例,一旦该客户端断开连接,它就会打印出所有客户端的提示消息。实质上,即使任何特定客户端断开连接,也不会打印对应于该客户端的propmt消息,直到最后一个客户端断开连接,从而使套接字“空闲”。 关于我如何解决这个问题并在任何同时连接的客户端断开连接而不等待所有客户端断开连接时打印出提示的任何指示都会有很大的帮助。
仅供参考,我使用多个Hyperterminal实例模拟上述环境。
CHEERS
答案 0 :(得分:1)
while (true) {
//Socket connection = socket1.accept();
thread.start();
thread1.start();
}
}
catch (Exception e) {}
不要抓住并吞下所有异常。此外,如果线程遇到未处理的异常,它将简单地死亡。您不会在while循环中捕获线程异常。
您无法重用线程对象。 run()方法完成后,您无法再次调用start()。您必须创建一个新线程(如果有意义,可能使用相同的runnable)。您还可以通过使变量名称具有描述性来改进变量名称。
答案 1 :(得分:0)
不要在AWT线程中执行网络代码,例如在actionPerformed()方法中。使用单独的线程。