COMP 361

Socket Programming




Socket-programming using TCP

Socket: a door between application process and endend- transport protocol (UCP or TCP)

TCP service: reliable transfer of bytes from one process to another



Client must contact server:

  • server process must first be running
  • server must have created socket (door) that welcomes client's contact

Client contacts server by:

  • creating client-local TCP Socket
  • specifying IP address, port number of server process

When client creates socket:

  • client TCP establishes connection to server TCP

When contacted by client:

  • server TCP creates new socket for server process to communicate with client
  • allows server to talk with multiple clients


Example client-server application:

  • client reads line from standard input (inFromUser stream), sends to server via socket (outToServer stream)
  • server reads line from socket
  • server converts line to uppercase, sends back to client
  • client reads, prints modified line from socket (inFromServer stream)

Input stream: sequence of bytes into process

Output stream: sequence of bytes out of process


Client/server socket interaction: TCP


Example: Java client (TCP)

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

class TCPClient {

public static void main(String argv[]) throws Exception
{

String sentence;
String modifiedSentence;

BufferedReader inFromUser =
new BufferedReader(new InputStreamReader(System.in));

Socket clientSocket = new Socket("hostname", 6789);

DataOutputStream outToServer =
new DataOutputStream(clientSocket.getOutputStream());

BufferedReader inFromServer =
new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

sentence = inFromUser.readLine();

outToServer.writeBytes(sentence + '\n');

modifiedSentence = inFromServer.readLine();

System.out.println("FROM SERVER: " + modifiedSentence);
clientSocket.close();

}
}

Example: Java server (TCP)

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

class TCPServer {

public static void main(String argv[]) throws Exception
{

String clientSentence;
String capitalizedSentence;

ServerSocket welcomeSocket = new ServerSocket(6789);

while(true) {

Socket connectionSocket = welcomeSocket.accept();

BufferedReader inFromClient =
new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));

DataOutputStream outToClient =
new DataOutputStream(connectionSocket.getOutputStream());

clientSentence = inFromClient.readLine();

capitalizedSentence = clientSentence.toUpperCase() + '\n';

outToClient.writeBytes(capitalizedSentence);

}
}
}

Socket programming with UDP

UDP: no "connection" between client and server

  • no handshaking
  • sender explicitly attaches IP address and port of destination
  • server must extract IP address, port of sender from received datagram

UDP: transmitted data may be received out of order, or lost


Client/server socket interaction: UDP


Example: Java client (UDP)

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

class UDPClient {

public static void main(String argv[]) throws Exception
{

BufferedReader inFromUser =
new BufferedReader(new InputStreamReader(System.in));

DatagramSocket clientSocket = new DatagramSocket();

InetAddress IPAddress = InetAddress.getByName("hostname");

byte[] sendData = new byte[1024];
byte[] receiveData = new byte[1024];

String sentence = inFromUser.readLine();

sendData = sentence.getBytes();

DatagramPacket sendPacket =
new DatagramPacket(sendData, sendData.length, IPAddress, 9876);

clientSocket.send(sendPacket);

DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);

clientSocket.receive(receivePacket);


String modifiedSentence =
new String(receivePacket.getData());

System.out.println("FROM SERVER:" + modifiedSentence);
clientSocket.close();

}
}

Example: Java server (UDP)

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

class TCPServer {

public static void main(String argv[]) throws Exception
{

DatagramSocket serverSocket = new DatagramSocket(9876);

byte[] receiveData = new byte[1024];
byte[] sendData = new byte[1024];

while(true) {

DatagramPacket receivePacket =
new DatagramPacket(receiveData, receiveData.length);

serverSocket.receive(receivePacket);

String sentence = new String(receivePacket.getData());

InetAddress IPAddress = receivePacket.getAddress();

int port = receivePacket.getPort();

String capitalizedSentence = sentence.toUpperCase();

sendData = capitalizedSentence.getBytes();

DatagramPacket sendPacket =
new DatagramPacket(sendData, sendData.length, IPAddress, port);

serverSocket.send(sendPacket);

}
}
}