Для моего домашнего задания у меня есть сеть узлов, которые передают сообщения друг другу. Каждый узел подключен к определенному количеству других узлов (я использую 4 для тестирования). Каждая ссылка имеет вес, и все узлы вычислили кратчайший путь для того, как они хотят, чтобы их сообщения отправлялись. Каждый отправляемый пакет состоит из протокола сообщений (жестко запрограммированного целого), целого числа, которое сообщает, сколько сообщений прошло через отправляющий узел, и пути маршрутизации для пакета.
Каждый узел имеет ветку для каждой из своих ссылок. В каждой ссылке есть активный сокет. Пакеты отправляются путем добавления 4-байтового int в начало сообщения, указывающего длину сообщения.
Все отлично работает, пока я не напрягаю сеть. Для моего теста есть 10 узлов, и я получаю 5 из них для отправки 10000 пакетов в простом цикле while () без Thread.sleep (). Без исключения всегда есть ошибка в какой-то момент во время выполнения в операторе if (a! = Len).
Пожалуйста, дайте мне знать, если я смогу что-то уточнить. Заранее спасибо! Вот код (из потока ссылок; send () и forward () вызываются из самого узла):
protected void listen(){
byte[] b;
int len;
try{
DataInputStream in = new DataInputStream(sock.getInputStream());
while(true){
len = in.readInt();
b = new byte[len];
int a = in.read(b,0,len);
if(a!=len){
System.out.println("ERROR: " + a + "!=" + len);
throw new SocketException(); //may have to fix...this will happen when message is corrupt/incomplete
}
Message m = new Message(b);
int p = m.getProtocol();
switch (p){
case CDNP.PACKET:
owner.incrementTracker();
System.out.print("\n# INCOMMING TRACKER: " + m.getTracker() + "\n>>> ");
owner.forward(m);
}
}
}catch (IOException e){
e.printStackTrace();
}
}
public void send(int tracker){
String[] message = { Conv.is(CDNP.PACKET), Conv.is(tracker), owner.getMST().toString() };
Message m = new Message(message);
forward(m);
}
public synchronized void forward(Message m){
try{
OutputStream out = sock.getOutputStream();
//convert length to byte array of length 4
ByteBuffer bb = ByteBuffer.allocate(4+m.getLength());
bb.putInt(m.getLength());
bb.put(m.getBytes());
out.write(bb.array());
out.flush();
}catch (UnknownHostException e){
System.out.println("ERROR: Could not send to Router at " + sock.getRemoteSocketAddress().toString());
return;
}catch (IOException e1){
}
}