2010-02-18 3 views
0

Я создаю приложение Java, которое одновременно прослушивает два порта и также способно многопоточно. Как я делаю это следующим образом. У меня очень простой графический интерфейс в 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, соответствующее этому клиенту, не печатается до тех пор, пока последний клиент не отключится, тем самым сделав сокет «бесплатным». Любые указатели на то, как я могу разрешить это и распечатать подсказки, когда и когда любой из одновременно подключенных клиентов отключится, не дожидаясь их отключения, будет очень полезной.

FYI, я имитирую вышеуказанную среду, используя несколько экземпляров Hyperterminal.

CHEERS

ответ

0

Не выполнять сетевой код в AWT потоке, например, в методе actionPerformed(). Используйте отдельный поток.

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

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


catch (Exception e) {} 

Не ловить и не проглатывать все исключения. Кроме того, если поток встречает необработанное исключение, он просто умрет. Вы не будете использовать исключения потоков в цикле while.
Вы не можете повторно использовать объекты нити. Как только метод run() завершится, вы не сможете снова вызвать start(). Вы должны создать новый поток (возможно, с тем же запуском, если это имеет смысл). Вы также можете улучшить имена переменных, сделав их описательными.

Смежные вопросы