Skip to content

Instantly share code, notes, and snippets.

@khalefa-phd
Last active February 10, 2021 18:02
Show Gist options
  • Save khalefa-phd/ab8835913f37ed598f862596068ca0cd to your computer and use it in GitHub Desktop.
Save khalefa-phd/ab8835913f37ed598f862596068ca0cd to your computer and use it in GitHub Desktop.

Network Lab 1

This lab is designed to help you in your programming project.

Getting Started:

  1. Make sure to download and install JDK, from Oracle

  2. To check if you have already JDK installed, go to the terminal and type javac

  3. Download EchoServer.java (from blackboard or here and EchoClient.java (from blackboard or here)

  4. Open two terminal screens.

  5. Go to the directory that has the downloaded files. "cd " Assume the directory is "c:\users\user\Downloads\network", You may type: cd "c:\users\user\Downloads\network" in the terminal. Note For more check out this for Windows, and this for MacOS.

  6. In the first terminal window, type: javac EchoServer.java

  7. To run the server, type: java EchoServer 9000, here the port we use is 9000

  8. In the second terminal window, type: javac EchoClient.java

  9. To run the client, type: java EchoClient 127.0.0.1 9000

  10. What ever you type in the client, it will be sent to the server and back to the client.

  11. Open a new terminal, and run another client.

  12. However, it would not work. Because the socket is already occupied with the other client.

  13. To solve this issue, you need allow multiple clients. To do that we need to change the server.

  14. Download the following two java files: EchoServerThread.java and EchoServer2.java

  15. Compile them, using javac EchoServer2.java & and javac EchoServerThread.java

  16. The updated server allows multiple clients. To run it, using java EchoServer2 9000' NOTE Make sure to close the other server, you can use ctrl+c

/*
* Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of Oracle or the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
import java.io.*;
import java.net.*;
public class EchoClient {
public static void main(String[] args) throws IOException {
if (args.length != 2) {
System.err.println("Usage: java EchoClient <host name> <port number>");
System.exit(1);
}
String hostName = args[0];
int portNumber = Integer.parseInt(args[1]);
try (Socket echoSocket = new Socket(hostName, portNumber);
PrintWriter out = new PrintWriter(echoSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in))) {
String userInput;
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput); // sending input to server
System.out.println("echo: " + in.readLine()); // printing the server response
}
} catch (UnknownHostException e) {
System.err.println("Don't know about host " + hostName);
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection to " + hostName);
System.exit(1);
}
}
}
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of Oracle or the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
import java.io.*;
import java.net.*;
public class EchoServer {
public static void main(String[] args) throws IOException {
if (args.length != 1) {
System.err.println("Usage: java EchoServer <port number>");
System.exit(1);
}
int portNumber = Integer.parseInt(args[0]);
try (ServerSocket serverSocket = new ServerSocket(portNumber); // Create the sever socket
Socket clientSocket = serverSocket.accept(); // blocking function
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in =
new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));) {
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("-- from Client: " + inputLine);
out.println(inputLine.toUpperCase()); // sending upper case version of the input
}
} catch (IOException e) {
System.out.println("Exception caught when trying to listen on port " + portNumber
+ " or listening for a connection");
System.out.println(e.getMessage());
}
}
}
// Adapted from Oracle
import java.io.*;
import java.net.*;
public class EchoServer2 {
public static void main(String[] args) throws IOException {
if (args.length != 1) {
System.err.println("Usage: java EchoServer2 <port number>");
System.exit(1);
}
int portNumber = Integer.parseInt(args[0]);
try (ServerSocket serverSocket = new ServerSocket(portNumber);) // Create the sever socket
{
for (;;) new EchoServerThread(serverSocket.accept()).start();
} catch (IOException e) {
System.out.println("Exception caught when trying to listen on port " + portNumber
+ " or listening for a connection");
System.out.println(e.getMessage());
}
}
}
// Adapted from Oracle
import java.io.*;
import java.net.*;
public class EchoServerThread extends Thread {
private Socket socket = null;
public EchoServerThread(Socket socket) {
super("EchoServerThread");
this.socket = socket;
}
public void run() {
try (PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));) {
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("-- from Client: " + inputLine);
out.println(inputLine.toUpperCase()); // sending upper case version of the input
}
} catch (IOException e) {
System.out.println("Exception caught \n");
System.out.println(e.getMessage());
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment