From 4a06626c8ade9b9a300681db78453245c522e442 Mon Sep 17 00:00:00 2001 From: Sebastian Rieger Date: Wed, 31 Oct 2018 17:46:32 +0100 Subject: [PATCH] reusable sockets demo --- .../socket/reuse/TCPServerReuse.java | 44 +++++++++++++++++++ .../socket/reuse/UDPServerReuse.java | 36 +++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 VerteilteSysteme-Examples/src/verteiltesysteme/socket/reuse/TCPServerReuse.java create mode 100644 VerteilteSysteme-Examples/src/verteiltesysteme/socket/reuse/UDPServerReuse.java diff --git a/VerteilteSysteme-Examples/src/verteiltesysteme/socket/reuse/TCPServerReuse.java b/VerteilteSysteme-Examples/src/verteiltesysteme/socket/reuse/TCPServerReuse.java new file mode 100644 index 0000000..5eb2a52 --- /dev/null +++ b/VerteilteSysteme-Examples/src/verteiltesysteme/socket/reuse/TCPServerReuse.java @@ -0,0 +1,44 @@ +/* Angelehnt an Kurose/Ross Computernetzwerke (bis 5e Java, ab 6e Python) */ + +package verteiltesysteme.socket.reuse; + +import java.io.*; +import java.net.*; + +class TCPServerReuse { + public static void main(String argv[]) throws Exception { + int tcpPort = 36037; + String clientSentence; + String capitalizedSentence; + + // Server-Socket erzeugen + @SuppressWarnings("resource") + ServerSocket welcomeSocket = new ServerSocket(); + // erlaubt das Wiederverwenden von Sockets, die für die individuellen Clients genutzt werden, auch wenn der Port nocht im Status "TIME_WAIT" ist + welcomeSocket.setReuseAddress(true); + welcomeSocket.bind(new InetSocketAddress(tcpPort)); + + System.out.println("TCP Server started. Waiting for incoming requests... (reuseAddress="+welcomeSocket.getReuseAddress()+", timeout="+welcomeSocket.getSoTimeout() +", buffersize="+welcomeSocket.getReceiveBufferSize()+")"); + + while (true) { + Socket connectionSocket = welcomeSocket.accept(); + + System.out.println("Received request from client " + connectionSocket.getInetAddress() + ":" + connectionSocket.getPort() + " generating response..."); + + BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); + DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); + + // Try/Catch hinzugefügt, nachdem bei Einsatz Amazon AWS (Healthcheck des ELB) clientSentence null war + try { + clientSentence = inFromClient.readLine(); + if (clientSentence != null) { + capitalizedSentence = clientSentence.toUpperCase() + '\n'; + outToClient.writeBytes(capitalizedSentence); + } + } catch (IOException ioe) { + ioe.printStackTrace(); + } + connectionSocket.close(); + } + } +} diff --git a/VerteilteSysteme-Examples/src/verteiltesysteme/socket/reuse/UDPServerReuse.java b/VerteilteSysteme-Examples/src/verteiltesysteme/socket/reuse/UDPServerReuse.java new file mode 100644 index 0000000..52d15b7 --- /dev/null +++ b/VerteilteSysteme-Examples/src/verteiltesysteme/socket/reuse/UDPServerReuse.java @@ -0,0 +1,36 @@ +/* Angelehnt an Kurose/Ross Computernetzwerke (bis 5e Java, ab 6e Python) */ + +package verteiltesysteme.socket.reuse; + +import java.net.*; + +class UDPServerReuse { + public static void main(String args[]) throws Exception { + int udpPort = 36037; + @SuppressWarnings("resource") + DatagramSocket serverSocket = new DatagramSocket(null); + // erlaubt das Wiederverwenden des Ports, mehrere Server-Prozesse können gleichen Port nutzen + serverSocket.setReuseAddress(true); + serverSocket.bind(new InetSocketAddress(udpPort)); + byte[] receiveData = new byte[1024]; + byte[] sendData = new byte[1024]; + + System.out.println("UDP Server started. Waiting for incoming requests... (reuseAddress="+serverSocket.getReuseAddress()+", timeout="+serverSocket.getSoTimeout() +", buffersize="+serverSocket.getReceiveBufferSize()+")"); + + while (true) { + DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); + serverSocket.receive(receivePacket); + String sentence = new String(receivePacket.getData(), 0, receivePacket.getLength()); + + InetAddress IPAddress = receivePacket.getAddress(); + int clientSrcPort = receivePacket.getPort(); + + System.out.println("Received request from client " + IPAddress + ":" + clientSrcPort + " generating response..."); + + String capitalizedSentence = sentence.toUpperCase(); + sendData = capitalizedSentence.getBytes(); + DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, clientSrcPort); + serverSocket.send(sendPacket); + } + } +}