2012-03-27 6 views
1

Вот код:Почему я не могу использовать два потока, поддерживающих один и тот же сокет в Java?

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(); 

В Таска, этот класс работает так:

 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 через свой собственный конструктор, но когда сокет получил соединение, TaskA может делать serversocket.accept, но серверная плата TaskB всегда имеет значение null, неправильно? Благодарю.

ответ

2

ServerSockets ищет новые соединения сокетов и блокирует данный порт. Если вы хотите, чтобы несколько серверных сокетов использовали несколько портов. Если вам нужно несколько потоков в разных сокетах, то используйте один серверный сокет, и у вас есть поток для выполнения работы после его создания. Принимающий просто ждет, чтобы его можно было создать, см. Здесь для правильного базового ввода в гнезда: http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html

+0

Вы также можете установить тайм-ауты приема, если это необходимо. – jefflunt

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