Hallo!
Ich baue und halte einen TCP Socket aufrecht.
Nun kann aber sein, das manchmal über Minuten/Stunden keine Daten gesendet werden müssen.
Aber mich muss dennoch einen Verbindungsabbruch erkennen.
Aber darf keine Daten über den Socket senden, sonst reagiert die Gegenseite.
Ich sende Daten über den Socket mit einer InnerClass:
Daten empfange ich vom Socket über einen Thread:
Ich baue und halte einen TCP Socket aufrecht.
Nun kann aber sein, das manchmal über Minuten/Stunden keine Daten gesendet werden müssen.
Aber mich muss dennoch einen Verbindungsabbruch erkennen.
Aber darf keine Daten über den Socket senden, sonst reagiert die Gegenseite.
Ich sende Daten über den Socket mit einer InnerClass:
Java:
/** Inner class representing the Consumer side */
class Consumer extends Thread {
public void run() {
while (true) {
byte[] b = null;
synchronized (list) {
while (list.size() == 0) {
try {
// System.out.println("CONSUMER WAITING");
list.wait(); // must own the lock
} catch (InterruptedException ex) {
System.out.println("CONSUMER INTERRUPTED");
}
}
b = list.removeLast();
list.notifyAll();
// int len = list.size();
// System.out.println("List size now " + len);
// if (done)
// break;
}
long timeDifference = (lastTransmissionTime + getPropertyDelayout()) - System.currentTimeMillis();
if (timeDifference > 0) {
try {
// System.out.println("Sleep " + timeDifference);
Thread.sleep(timeDifference);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
process(b); // Outside synch section (could take time)
// yield(); DITTO
}
}
void process(byte[] b) {
try {
if (b == null || getOutputState() != 3) {
return;
}
lastTransmissionTime = System.currentTimeMillis();
socket1.getOutputStream().write(b);
} catch (Exception e) {
updateOutputError("[ERROR] Sending Message: " + e.getMessage());
if (shouldBeConnected) {
reConnect();
} else {
disconnect(false, false);
}
}
}
}
Daten empfange ich vom Socket über einen Thread:
Java:
public void run() {
InputStream is = null;
try {
is = socket.getInputStream();
in = new BufferedInputStream(is);
} catch (IOException e) {
try {
socket.close();
} catch (IOException e2) {
System.err.println("Socket not closed :" + e2);
}
parent.error("Could not open socket : " + e.getMessage(), false);
parent.disconnect(false, false);
return;
}
while (!desonnected) {
try {
byte[] got = readInputStream(in); // in.readLine();
if (got == null) {
parent.error("Connection closed by client", false);
break;
}
parent.receiveNewBytes(got, false);
} catch (IOException e) {
if (!desonnected) {
parent.error(e.getMessage(), "Connection lost", false);
}
break;
}
} // end of while
try {
is.close();
in.close();
} catch (Exception err) {
}
socket = null;
}// end of run