ServerSocket ss = new ServerSocket(0, 0, InetAddress.getLoopbackAddress());
Socket clientSocket = new Socket();
try { // Start the server thread Thread s1 = newThread(new ServerThread(ss));
s1.start();
// Start the client thread
ClientThread ct = new ClientThread(clientSocket, ss.getLocalPort()); Thread c1 = newThread(ct);
c1.start();
// Wait for the client thread to finish
c1.join(20000);
// If timeout, we assume there is a deadlock if (c1.isAlive() == true) { // Close the socket to force the server thread // terminate too
s1.stop(); thrownew Exception("Takes too long. Dead lock");
}
} finally {
ss.close();
clientSocket.close();
}
}
}
class ServerThread implements Runnable {
privatestaticboolean dbg = false;
ObjectInputStream in;
ObjectOutputStream out;
ServerSocket server;
Socket sock;
public ServerThread(ServerSocket serverSocket) throws Exception { this.server = serverSocket;
}
publicvoid ping(int cnt) {
Message.write(out, new PingMessage(cnt));
}
privateint cnt = 1;
publicvoid run() {
try { if (Thread.currentThread().getName().startsWith("child") == false) {
sock = server.accept();
newThread(this, "child").start();
out = new ObjectOutputStream(sock.getOutputStream());
out.flush();
if (dbg) System.out.println("*** ping0 ***");
ping(0); if (dbg) System.out.println("*** ping1 ***");
ping(1); if (dbg) System.out.println("*** ping2 ***");
ping(2); if (dbg) System.out.println("*** ping3 ***");
ping(3); if (dbg) System.out.println("*** ping4 ***");
ping(4); if (dbg) System.out.println("*** end ***");
}
} catch (Throwable e) {
System.out.println(e); // If anything goes wrong, just quit.
}
if (Thread.currentThread().getName().startsWith("child")) { try {
in = new ObjectInputStream(sock.getInputStream());
while (true) { if (dbg) System.out.println("read " + cnt);
Message msg = (Message) in.readObject(); if (dbg) System.out.println("read done " + cnt++); switch (msg.code) { case Message.PING: { if (true) System.out.println("ping recv'ed");
} break;
}
}
} catch (Throwable e) { // If anything goes wrong, just quit. }
}
}
}
}
class ClientThread implements Runnable {
ObjectInputStream in;
ObjectOutputStream out;
Socket sock;
public ClientThread(Socket sock, int serverPort) throws Exception { try {
System.out.println("About to connect the client socket"); this.sock = sock; this.sock.connect(new InetSocketAddress(InetAddress.getLoopbackAddress(), serverPort));
System.out.println("connected");
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.