У меня есть то, что должно было быть структурированным наложением 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
Я не вижу, где приемник выполняет чтение сообщений, насколько я могу судить, ваш ресивер умрет после того, как будет прочитано первое сообщение. – vanza
Как мне это сделать? –
Добавить петлю в приемник? – vanza