2010-02-18 49 views
0

我正在構建一個Java應用程序,它可以同時偵聽2個端口,並且還能夠執行多線程。 我如何做到這一點如下。我在PortApp.java中有一個非常基本的圖形用戶界面,它通過2個文本框輸入2個整數,並且還有一個監聽按鈕。所以當點擊監聽按鈕時,下面的代碼被執行。Java套接字線程問題

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類的()如下

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'ed提示信息','同時連接到同一端口'的客戶端中的任何一個斷開連接,但是這似乎沒有發生,它不打印出提示符,直到最後一個客戶端連接到該端口實例,一旦該客戶端斷開連接,它就會打印出所有客戶端的提示信息。實質上,即使任何特定的客戶端斷開連接,與該客戶端對應的propmt消息也不會被打印,直到最後一個客戶端斷開,從而使套接字「空閒」。 任何關於如何解決這個問題的指針以及如何在任何同時連接的客戶端斷開連接而不等待它們全部斷開的情況下打印出提示將非常有幫助。

僅供參考,我使用多個超級終端實例模擬上述環境。

CHEERS

回答

0

不執行在AWT線程網絡代碼,例如在actionPerformed()方法中。使用一個單獨的線程。

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

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


catch (Exception e) {} 

不要捕捉併吞下所有例外。另外,如果線程遇到未處理的異常,它將會簡單地死亡。你不會在while循環中捕獲線程異常。
您不能重用線程對象。一旦run()方法完成,就不能再次調用start()。您必須創建一個新線程(如果有意義的話,可能會使用相同的可運行程序)。你也可以通過使它們具有描述性來改進變量名稱。