2015-02-16 2 views
0

У меня есть то, что должно было быть структурированным наложением P2P. Сервер запускается, прослушивает регистрационное сообщение от клиента и затем должен отправить подтверждение клиенту.Отсутствующие сообщения Java Socket

Проблема в том, что я получаю только 1 подтверждение, хотя 10 отправлено. Чтобы упростить, я отправляю регистрацию от клиента в вызове StartNode(), и я хочу, чтобы узел начал прослушивать ответ после отправки регистрационного сообщения, но только одно из подтверждающих сообщений принимается.

Моя регистрация если работа хорошо. Мой сервер получает все 10 сообщений и отправляет подтверждения на соответствующие порты, но получает только 1 подтверждение. Я думаю, что проблема может заключаться в том, как я слушаю подтверждения, хотя это тот же код, который я использовал на сервере, поэтому я думаю, что это может быть какое-то состояние гонки, потому что это не всегда то же подтверждение, которое получено.

//SINGLE CLIENT 
    public static void main(String args[]) throws IOException { 
     for (int i = 0; i <= 10; i++) { 
      Socket newS = new Socket(args[0],Integer.parseInt(args[1]));    
      Thread mNode = new MessagingNode(newS); 
      mNode.start(); 

     }  
    } 

    public void run() { 

     try { 
      StartNode(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     boolean confirm = false; 
     while (!confirm) { 
      System.out.println("listening on port :" + portnumber); 
      try { 
       nsocket = cssocket.accept(); 
      } catch (IOException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
      Thread receiver = new MessageReceiver(cssocket,nsocket); 
      receiver.start(); 
     } 

} 

//RECEIVER CLASS 
public void run() { 
    System.out.println("Recieving"); 
    synchronized (socket){ 
    int dataLength; 
    try { 
     din = new DataInputStream(socket.getInputStream()); 
     dataLength = din.readInt();    
     byte[] data = new byte[dataLength]; 
     din.readFully(data, 0, dataLength); 
     Message inbound = new Message(data);     
     if (((int)inbound.messageT) == 2) { 
      MessageONSR register = new MessageONSR(data); 
      System.out.println(register.toString()); 
      MessagingNode addNode = new MessagingNode(register); 
      if (registry.NodeExists(addNode)) { 
       System.out.println("Registration request un-successful. Messaging Node already exists in overlay. The number of messaging nodes currently constituting the overlay is ("+registry.regC+")"); 
      } else if (!CheckMismatch(register)) { 
       System.out.println("Registration request un-successful. The number of messaging nodes currently constituting the overlay is ("+registry.regC+")"); 
      } else { 
       registry.RegisterNodes(addNode); 
       System.out.println("Registration request from " + addNode.portnumber + " successful. The number of messaging nodes currently constituting the overlay is ("+registry.regC+")"); 
      } 
     } if (((int)inbound.messageT) == 3) { 
      MessageRRS register = new MessageRRS(data); 
      System.out.println(register.status); 
      this.interrupt(); 

     } 
     } catch (SocketException se) { 
     System.out.println(se.getMessage()); 
     } catch (IOException ioe) { 
     System.out.println(ioe.getMessage()); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    this.interrupt(); 
} 
} 

listening on port :510 
listened on port :510 
14Sent Registration 
11Sent Registration 
listening on port :512 
listening on port :515 
listened on port :515 
listened on port :512 
12Sent Registration 
listening on port :513 
listened on port :513 
listening on port :510 
***listened on port :510 
Recieving 
30*** 
10Sent Registration 
listening on port :511 
listened on port :511 
19Sent Registration 
listening on port :520 
listened on port :520 
13Sent Registration 
listening on port :514 
listened on port :514 
18Sent Registration 
listening on port :519 
listened on port :519 
17Sent Registration 
listening on port :518 
listened on port :518 
15Sent Registration 
listening on port :516 
listened on port :516 
16Sent Registration 
listening on port :517 
listened on port :517 
+1

Я не вижу, где приемник выполняет чтение сообщений, насколько я могу судить, ваш ресивер умрет после того, как будет прочитано первое сообщение. – vanza

+0

Как мне это сделать? –

+0

Добавить петлю в приемник? – vanza

ответ

-1

Я понял мою проблему, поэтому я был только получать одно сообщение, потому что мой ServerSocket был объявлен как статический, что означает, к тому времени мои слушатели начали было overidden до последнего узла реализованным.

+0

Не имеет смысла, если у вас нет нескольких 'ServerSockets', что само по себе не имеет смысла. – EJP

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