import java.net.*; import java.io.*; /* * Start one thread for receiving a packet, wait for it to set up, * send a packet to it, and wait until it completes. Compare the * packet to make sure it came thru without errors. */ public class SocketSendReceiveTest implements Runnable { public static final int port = 4000 + (int)(java.lang.Math.random() * 2000); public static final String message = "hello"; public static int count = 0; public static String received; void send() throws Exception { InetAddress local = InetAddress.getLocalHost(); Socket sender = new Socket(local, port); byte []message_bytes = message.getBytes(); DataOutputStream out = new DataOutputStream(sender.getOutputStream()); out.write(message_bytes, 0, message_bytes.length); out.flush(); sender.close(); } void receive() throws Exception { ServerSocket socket = new ServerSocket(port); synchronized(this) { notifyAll(); } Socket connection = socket.accept(); DataInputStream in = new DataInputStream(connection.getInputStream()); byte[] buffer = new byte[100]; int length = in.read(buffer); connection.close(); socket.close(); received = new String(buffer, 0, length); count++; if ( message.length() != received.length() ) throw new Exception("Receved "+ received.length()+ " bytes but sent "+message.length() + " bytes"); if ( ! message.equals(received) ) throw new Exception("Receved \""+ received+ "\" but sent \""+message + "\""); } public void run() { String name = Thread.currentThread().getName(); if (name.equals("timer")) { try { Thread.sleep(10000); } catch (InterruptedException e){} System.out.println("FAILED: timer triggered"); System.exit(0); } try { receive(); } catch (Exception e) { System.out.println("FAILED: receiver (port "+port + "): " + e); System.exit(0); } } public static void main(String args[]) { try { SocketSendReceiveTest sender = new SocketSendReceiveTest(); SocketSendReceiveTest receiver = new SocketSendReceiveTest(); Thread receiver_thread = new Thread(receiver); /* Make sure the test terminates even if it hangs on network */ SocketSendReceiveTest timer = new SocketSendReceiveTest(); Thread timer_thread = new Thread(timer, "timer"); timer_thread.start(); synchronized(receiver) { receiver_thread.start(); receiver.wait(); } try { sender.send(); } catch (Exception e) { System.out.println("FAILED: receiver (port "+port + "): " + e); System.exit(0); } receiver_thread.join(); if (0 == count) throw new Exception("Nothing received"); System.out.println("PASSED: Socket send/receive count="+count+ " message="+received); System.exit(0); } catch (Exception e) { System.out.println("FAILED: " + e); System.exit(0); } } }