Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Socket programming goal: learn how to build client/server applications that communicate using sockets socket: dropbox between application process and endend-transport protocol application process socket application process transport transport network network link physical Internet link controlled by app developer controlled by OS physical Application Layer 2-1 Socket programming Two socket types for two transport services: § UDP: unreliable datagram § TCP: reliable, byte stream-oriented Application Example: 1. Client reads a line of characters (data) from its keyboard and sends the data to the server. 2. The server receives the data and converts characters to uppercase. 3. The server sends the modified data to the client. 4. The client receives the modified data and displays the line on its screen. Application Layer 2-2 Socket programming with UDP UDP: no “connection” between client & server v v v no handshaking before sending data sender explicitly attaches IP destination address and port # to each packet rcvr extracts sender IP address and port# from received packet UDP: transmitted data may be lost or received out-of-order Application viewpoint: v UDP provides unreliable transfer of groups of bytes (“datagrams”) between client and server Application Layer 2-3 Client/server socket interaction: UDP server (running on serverIP) create socket, port= x: serverSocket = DatagramSocket(x) read datagram from serverSocket write reply to serverSocket specifying client address, port number client create socket: clientSocket = DatagramSocket() Create datagram with server IP and port=x; send datagram via clientSocket read datagram from clientSocket close clientSocket Application 2-4 Example: Java client (UDP) import java.io.*; import java.net.*; class UDPClient { public static void main(String args[]) throws Exception { create input stream create client socket translate hostname to IP addr using DNS 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(); Application Layer 2-5 Example: Java client (UDP) create datagram with data-to-send, length, IP addr, port DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876); send datagram to server clientSocket.send(sendPacket); DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); read datagram from server clientSocket.receive(receivePacket); String modifiedSentence = new String(receivePacket.getData()); System.out.println("FROM SERVER:" + modifiedSentence); clientSocket.close(); } } Application Layer 2-6 Example: Java server (UDP) import java.io.*; import java.net.*; create datagram socket at port 9876 class UDPServer { public static void main(String args[]) throws Exception { DatagramSocket serverSocket = new DatagramSocket(9876); byte[] receiveData = new byte[1024]; byte[] sendData = new byte[1024]; while(true) { create space for received datagram receive datagram DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); serverSocket.receive(receivePacket); Application Layer 2-7 Example: Java server (UDP) String sentence = new String(receivePacket.getData()); get IP addr port #, of sender InetAddress IPAddress = receivePacket.getAddress(); int port = receivePacket.getPort(); String capitalizedSentence = sentence.toUpperCase(); sendData = capitalizedSentence.getBytes(); create datagram to send to client DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); write out datagram to socket serverSocket.send(sendPacket); } } } end of while loop, loop back and wait for another datagram Application Layer 2-8 Example app: UDP client Python UDPClient include Python’s socket library import socket serverName = ‘hostname’ serverPort = 12000 create UDP socket for server get user keyboard input Attach server name, port to message; send into socket clientSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) message = raw_input(’Input lowercase sentence:’) clientSocket.sendto(message,(serverName, serverPort)) read reply characters from socket into string modifiedMessage, serverAddress = print out received string and close socket print modifiedMessage clientSocket.recvfrom(2048) clientSocket.close() Application Layer 2-9 Example app: UDP server Python UDPServer from socket import * serverPort = 12000 create UDP socket serverSocket = socket(AF_INET, SOCK_DGRAM) bind socket to local port number 12000 serverSocket.bind(('', serverPort)) print “The server is ready to receive” loop forever Read from UDP socket into message, getting client’s address (client IP and port) send upper case string back to this client while 1: message, clientAddress = serverSocket.recvfrom(2048) modifiedMessage = message.upper() serverSocket.sendto(modifiedMessage, clientAddress) Application Layer 2-10 Socket programming with TCP client must contact server v v server must be first running server must have created socket (dropbox) that welcomes client’s contact v server accepts connect by: § creating new connectionspecific socket § allows server to talk with multiple clients client connects to server by: v v creating TCP socket, specifying IP address, port number of server process client socket is now bound to that specific server application viewpoint: TCP provides reliable, in-order byte-stream transfer (“pipe”) between client and server Application Layer 2-11 Client/server socket interaction: TCP client server (running on hostid) create socket, port=x, for incoming request: serverSocket = ServerSocket() wait for incoming TCP connection request connectionSocket = connection serverSocket.accept() read request from connectionSocket write reply to connectionSocket close connectionSocket setup create socket, connect to hostid, port=x clientSocket = socket() send request using clientSocket read reply from clientSocket close clientSocket Application Layer 2-12 Example: Java client (TCP) import java.io.*; import java.net.*; class TCPClient { create input stream create clientSocket object of type Socket, connect to server create output stream attached to socket this package defines Socket() and ServerSocket() classes public static void main(String argv[]) throws Exception { server name, String sentence; e.g., www.umass.edu String modifiedSentence; server port # BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); Socket clientSocket = new Socket("hostname", 6789); DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); Application Layer 2-13 Example: Java client (TCP) BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); create input stream attached to socket sentence = inFromUser.readLine(); send line to server outToServer.writeBytes(sentence + '\n'); read line from server modifiedSentence = inFromServer.readLine(); System.out.println("FROM SERVER: " + modifiedSentence); close socket clientSocket.close(); (clean up behind yourself!) } } Application Layer 2-14 Example: Java server (TCP) import java.io.*; import java.net.*; class TCPServer { create welcoming socket at port 6789 wait, on welcoming socket accept() method for client contact create, new socket on return create input stream, attached to socket 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())); Application Layer 2-15 Example: Java server (TCP) create output stream, attached to socket DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); read in line from socket clientSentence = inFromClient.readLine(); capitalizedSentence = clientSentence.toUpperCase() + '\n'; write out line to socket outToClient.writeBytes(capitalizedSentence); } } } end of while loop, loop back and wait for another client connection Application Layer 2-16 Example app: TCP client Python TCPClient import socket serverName = ‘servername’ create TCP socket for server, remote port 12000 serverPort = 12000 clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) clientSocket.connect((serverName,serverPort)) No need to attach server name, port sentence = raw_input(‘Input lowercase sentence:’) clientSocket.send(sentence) modifiedSentence = clientSocket.recv(1024) print ‘From Server:’, modifiedSentence clientSocket.close() Application Layer 2-17 Example app: TCP server Python TCPServer create TCP welcoming socket server begins listening for incoming TCP requests loop forever server waits on accept() for incoming requests, new socket created on return read bytes from socket (but not address as in UDP) close connection to this client (but not welcoming socket) from socket import * serverPort = 12000 serverSocket = socket(AF_INET,SOCK_STREAM) serverSocket.bind((‘’,serverPort)) serverSocket.listen(1) print ‘The server is ready to receive’ while 1: connectionSocket, addr = serverSocket.accept() sentence = connectionSocket.recv(1024) capitalizedSentence = sentence.upper() connectionSocket.send(capitalizedSentence) connectionSocket.close() Application Layer 2-18