Tutorial

We’re going to implement TCP connection for the server side now

  • serverSocket.accept() - start accepting requests from the client

  • outputstream gets input from client

  • inputstream get input from scanner

  • Loop

  • s = string s defined slide before

  • s defined each line from server side input stream

  • check if it contains a word like bye

  • if it is bye, print out bye, flush then print the whole string then flush again

  • Then close our streams

  • All this code is in a try catch

import java.util.*;
import java.io.*;
import java.net.*;
/**
 * A Simple Client
 * CPSC 441
 */

public class TCPClient {

	public static void main(String[] args) {

		String s, tmp;
		Scanner inputStream;
		PrintWriter outputStream;
		Scanner userinput; // Get input from user to send to server

		try {
			// connects to port server app listesing at port 8888 in the same
			// machine
			Socket socket = new Socket("localhost", 8888); // Make socket and give port

			// Create necessary streams
			outputStream = new PrintWriter(new DataOutputStream( //for output stream
					socket.getOutputStream()));
			inputStream = new Scanner(new InputStreamReader(
					socket.getInputStream())); 
			userinput = new Scanner(System.in);  // get user input by system scanner

			// send/receive messages to/from server
			while (true) {
				System.out.println("Enter Text Message for Echo Server: ");
				tmp = userinput.nextLine(); // get user input line by line

				// Send user input message to server
				outputStream.println(tmp);    // put in output stream to send line               by line to server
				// Flush to make sure message is send
				outputStream.flush();   // once done sending to socket, we flush so we can send the next. Here we use flush to clear the output stream 

				s = inputStream.nextLine();   // get next line from input stream
				System.out.println(s);

				// Exit if message from server is "bye"
                                // Should do this from both client and server side so server terminates then client terminates
				if (s.equalsIgnoreCase("bye")
					break;

			}
			inputStream.close();
			outputStream.close();
		}
		catch (Exception e) {
			System.out.println("Error: " + e.getMessage());
		}
	}
}
import java.io.*;
import java.net.*;
import java.util.*;

/**
 * A Simple Echo Server
 * CPSC 441
 */

public class TCPServer {

	public static void main(String[] args) {

		String s;
		Scanner inputStream;
		PrintWriter outputStream;
		ServerSocket serverSocket;

		try {
			// Listen on port 8888
			serverSocket = new ServerSocket(8888);

			Socket socket = serverSocket.accept();
			// Connected to client
			outputStream = new PrintWriter(new DataOutputStream(
					socket.getOutputStream()));
			inputStream = new Scanner(new InputStreamReader(
					socket.getInputStream()));

			// Respond to messages from the client
			while (true) {
				s = inputStream.nextLine();
				System.out.println(s);

				// exit if message from client is "bye"
				if (s.equalsIgnoreCase("bye")) {
					outputStream.println("bye");
					outputStream.flush();
					break;
				}

				outputStream.println(s);
				outputStream.flush();
			}

			inputStream.close();
			outputStream.close();
		}
		catch (Exception e) {
			System.out.println("Error: " + e.getMessage());
		}
	}
}

  • Multi threading allows us to respond to multiple clients at the same time

  • Important for handling multiple users at the same tiem

  • Make threads inside the loop for each connection

  • One socket, but accept multiple requests

  • Sever sever = new Sever(clientSocket) → Makes separate areas on the server to accept multiple requests

  • Thread thread = new Thread(server) → Handles one client

  • thread.start → starts each thread

  • Iterate through each line of the input stream

  • Defines what happens in each thread

  • Same as other code but its in the run() function

  • For server side

  • Will be called for each thread

Server side Fully implemented:

import java.io.*;
import java.net.*;
import java.util.*;

/**
 * A Simple Echo Server
 * CPSC 441
 */

class WorkerThread implements Runnable{
	private Socket socket;
	public WorkerThread(Socket socket){
		this.socket = socket;
	}

	@Override
	public void run() {
		// Connected to client
		System.out.println("Worker Thread started: " + Thread.currentThread().getName());
		Scanner inputStream;
		PrintWriter outputStream;
        try {
            outputStream = new PrintWriter(new DataOutputStream(
                    socket.getOutputStream()));
			inputStream = new Scanner(new InputStreamReader(
					socket.getInputStream()));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

		// Respond to messages from the client
		while (true) {
			String s = inputStream.nextLine();
			System.out.println(s);

			// exit if message from client is "bye"
			if (s.equalsIgnoreCase("bye")) {
				outputStream.println("bye");
				outputStream.flush();
				break;
			}

			outputStream.println(s);
			outputStream.flush();
		}

		inputStream.close();
		outputStream.close();
	}
}

public class TCPServer {

	public static void main(String[] args) {

		String s;
		ServerSocket serverSocket;

		try {
			// Listen on port 8888
			serverSocket = new ServerSocket(8888);

			while(true) {
				System.out.println("Waiting for Client");
				Socket socket = serverSocket.accept();
				System.out.println("Client Connected");
				WorkerThread workerThread = new WorkerThread(socket);
				Thread thr = new Thread(workerThread);
				thr.start();
			}
		}
		catch (Exception e) {
			System.out.println("Error: " + e.getMessage());
		}
	}
}