diff --git a/ws2012/P2P/uebungen/2/p2p_ex2/src/buffered/BufferedNetworkStack.java b/ws2012/P2P/uebungen/2/p2p_ex2/src/buffered/BufferedNetworkStack.java index 3f5c8e27..3d6e8ee2 100644 --- a/ws2012/P2P/uebungen/2/p2p_ex2/src/buffered/BufferedNetworkStack.java +++ b/ws2012/P2P/uebungen/2/p2p_ex2/src/buffered/BufferedNetworkStack.java @@ -114,9 +114,9 @@ class BufferedNetworkStack { case MessageType.CMD_POP: try { - // Element popped = stack.pop(); - // send(popped.toString(), client); - // System.out.println("Pop " + popped); + String popped = stack.pop(); + send(popped, client); + System.out.println("Pop " + popped); } catch (EmptyStackException e) { System.out.println("Received pop but stack is empty"); } diff --git a/ws2012/P2P/uebungen/2/p2p_ex2/src/buffered/BufferedNetworkStackClient.java b/ws2012/P2P/uebungen/2/p2p_ex2/src/buffered/BufferedNetworkStackClient.java index 626be28f..41d72f86 100644 --- a/ws2012/P2P/uebungen/2/p2p_ex2/src/buffered/BufferedNetworkStackClient.java +++ b/ws2012/P2P/uebungen/2/p2p_ex2/src/buffered/BufferedNetworkStackClient.java @@ -6,6 +6,8 @@ import java.nio.ByteBuffer; import java.nio.channels.DatagramChannel; public class BufferedNetworkStackClient { + protected static final long TIMEOUT = 5000; + protected static final int BUF_SIZE = 128; private DatagramChannel channel = null; @@ -15,7 +17,8 @@ public class BufferedNetworkStackClient { buf = ByteBuffer.allocate(BUF_SIZE); } - public void push(String s, String host, int port) throws IOException { + public void push(String s, String host, int port) throws IOException, + TimeoutException { if (channel == null) { channel = DatagramChannel.open(); } @@ -33,7 +36,16 @@ public class BufferedNetworkStackClient { buf.flip(); buf = ByteBuffer.allocate(BUF_SIZE); - channel.receive(buf); + + channel.configureBlocking(false); + long time = System.currentTimeMillis() + TIMEOUT; + while (buf.remaining() == BUF_SIZE && System.currentTimeMillis() < time) { + channel.receive(buf); + } + if (buf.remaining() == BUF_SIZE) { + throw new TimeoutException("ERROR: Buffer empty - no data recieved"); + } + channel.configureBlocking(true); byte[] receivedData = buf.array(); String infoPacket = new String(receivedData).trim(); @@ -43,6 +55,7 @@ public class BufferedNetworkStackClient { int remoteBufSize = Integer.valueOf(info[0]); int sessionId = Integer.valueOf(info[1]); + System.out.println('4'); sendChunks(s, dest, remoteBufSize, sessionId); } @@ -77,7 +90,8 @@ public class BufferedNetworkStackClient { } } - public String pop(String host, int port) throws IOException { + public String pop(String host, int port) throws IOException, + TimeoutException { if (channel == null) { channel = DatagramChannel.open(); } @@ -85,11 +99,19 @@ public class BufferedNetworkStackClient { InetSocketAddress dest = new InetSocketAddress(host, port); channel.send(ByteBuffer.wrap(new byte[] { MessageType.CMD_POP }), dest); - channel.receive(buf); + channel.configureBlocking(false); + long time = System.currentTimeMillis() + TIMEOUT; + while (buf.remaining() == BUF_SIZE && System.currentTimeMillis() < time) { + channel.receive(buf); + } + if (buf.remaining() == BUF_SIZE) { + throw new TimeoutException("ERROR: Buffer empty - no data recieved"); + } + channel.configureBlocking(true); + byte[] receivedData = buf.array(); String strReceived = new String(receivedData).toString().trim(); - System.out.println(strReceived); return strReceived; } diff --git a/ws2012/P2P/uebungen/2/p2p_ex2/src/buffered/ClientGUI.java b/ws2012/P2P/uebungen/2/p2p_ex2/src/buffered/ClientGUI.java index 4baca129..e78b2eb5 100644 --- a/ws2012/P2P/uebungen/2/p2p_ex2/src/buffered/ClientGUI.java +++ b/ws2012/P2P/uebungen/2/p2p_ex2/src/buffered/ClientGUI.java @@ -97,9 +97,11 @@ public class ClientGUI extends JFrame { client.print(txtHost.getText(), Integer.valueOf(txtPort.getText())); } catch (NumberFormatException e1) { - e1.printStackTrace(); + textPane.setText(textPane.getText() + + "\nErroneous port number. " + e1.getMessage()); } catch (IOException e1) { - e1.printStackTrace(); + textPane.setText(textPane.getText() + + "\nCould not send to server. " + e1.getMessage()); } } }); @@ -110,14 +112,18 @@ public class ClientGUI extends JFrame { try { received = client.pop(txtHost.getText(), Integer.valueOf(txtPort.getText())); - textPane.setText(textPane.getText() + "\n" + received); + textPane.setText(textPane.getText() + "\nPopped: " + + received); } catch (NumberFormatException e1) { - e1.printStackTrace(); - } catch (IOException e2) { - e2.printStackTrace(); + textPane.setText(textPane.getText() + + "\nErroneous port number. " + e1.getMessage()); + } catch (TimeoutException e2) { + textPane.setText(textPane.getText() + "\nServer timed out." + + e2.getMessage()); + } catch (IOException e1) { + textPane.setText(textPane.getText() + + "\nCould not send to server. " + e1.getMessage()); } - - textPane.setText(textPane.getText() + "\n" + received); } }); btnPush.addActionListener(new ActionListener() { @@ -126,9 +132,15 @@ public class ClientGUI extends JFrame { String host = txtHost.getText(); int port = Integer.valueOf(txtPort.getText()); client.push(userinput.getText(), host, port); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + } catch (NumberFormatException e1) { + textPane.setText(textPane.getText() + + "\nErroneous port number. " + e1.getMessage()); + } catch (IOException e1) { + textPane.setText(textPane.getText() + + "\nCould not send to server. " + e1.getMessage()); + } catch (TimeoutException e) { + textPane.setText(textPane.getText() + "\nServer timed out." + + e.getMessage()); } } }); diff --git a/ws2012/P2P/uebungen/2/p2p_ex2/src/buffered/MessageType.java b/ws2012/P2P/uebungen/2/p2p_ex2/src/buffered/MessageType.java new file mode 100644 index 00000000..17911086 --- /dev/null +++ b/ws2012/P2P/uebungen/2/p2p_ex2/src/buffered/MessageType.java @@ -0,0 +1,8 @@ +package buffered; + +public class MessageType { + protected static final byte CMD_PUSH = '0'; + protected static final byte CMD_DATA = '1'; + protected static final byte CMD_POP = '2'; + protected static final byte CMD_PRINT = '3'; +} diff --git a/ws2012/P2P/uebungen/2/p2p_ex2/src/buffered/TimeoutException.java b/ws2012/P2P/uebungen/2/p2p_ex2/src/buffered/TimeoutException.java new file mode 100644 index 00000000..99da07b7 --- /dev/null +++ b/ws2012/P2P/uebungen/2/p2p_ex2/src/buffered/TimeoutException.java @@ -0,0 +1,7 @@ +package buffered; + +public class TimeoutException extends Exception { + public TimeoutException(String msg) { + super(msg); + } +}