Socket programming goal learn how to build clientserver
Socket programming goal: learn how to build client/server applications that communicate using sockets socket: dropbox between application process and end-transport protocol application process socket application process transport 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: 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 server. IP) create socket, port= x: server. Socket = Datagram. Socket(x) read datagram from server. Socket write reply to server. Socket specifying client address, port number client create socket: client. Socket = Datagram. Socket() Create datagram with server IP and port=x; send datagram via client. Socket read datagram from client. Socket close client. Socket 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 Buffered. Reader in. From. User = new Buffered. Reader(new Input. Stream. Reader(System. in)); Datagram. Socket client. Socket = new Datagram. Socket(); Inet. Address IPAddress = Inet. Address. get. By. Name("hostname"); byte[] send. Data = new byte[1024]; byte[] receive. Data = new byte[1024]; String sentence = in. From. User. read. Line(); send. Data = sentence. get. Bytes(); Application Layer 2 -5
Example: Java client (UDP) create datagram with data-to-send, length, IP addr, port Datagram. Packet send. Packet = new Datagram. Packet(send. Data, send. Data. length, IPAddress, 9876); send datagram to server client. Socket. send(send. Packet); Datagram. Packet receive. Packet = new Datagram. Packet(receive. Data, receive. Data. length); read datagram from server client. Socket. receive(receive. Packet); String modified. Sentence = new String(receive. Packet. get. Data()); System. out. println("FROM SERVER: " + modified. Sentence); client. Socket. 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 { Datagram. Socket server. Socket = new Datagram. Socket(9876); byte[] receive. Data = new byte[1024]; byte[] send. Data = new byte[1024]; while(true) { create space for received datagram receive datagram Datagram. Packet receive. Packet = new Datagram. Packet(receive. Data, receive. Data. length); server. Socket. receive(receive. Packet); Application Layer 2 -7
Example: Java server (UDP) String sentence = new String(receive. Packet. get. Data()); get IP addr port #, of sender Inet. Address IPAddress = receive. Packet. get. Address(); int port = receive. Packet. get. Port(); String capitalized. Sentence = sentence. to. Upper. Case(); send. Data = capitalized. Sentence. get. Bytes(); create datagram to send to client Datagram. Packet send. Packet = new Datagram. Packet(send. Data, send. Data. length, IPAddress, port); write out datagram to socket server. Socket. send(send. Packet); } } } 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 server. Name = ‘hostname’ server. Port = 12000 create UDP socket for server get user keyboard input Attach server name, port to message; send into socket client. Socket = socket(socket. AF_INET, socket. SOCK_DGRAM) message = raw_input(’Input lowercase sentence: ’) client. Socket. sendto(message, (server. Name, server. Port)) read reply characters from socket into string modified. Message, server. Address = print out received string and close socket print modified. Message client. Socket. recvfrom(2048) client. Socket. close() Application Layer 2 -9
Example app: UDP server Python UDPServer from socket import * server. Port = 12000 create UDP socket server. Socket = socket(AF_INET, SOCK_DGRAM) bind socket to local port number 12000 server. Socket. bind(('', server. Port)) 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, client. Address = server. Socket. recvfrom(2048) modified. Message = message. upper() server. Socket. sendto(modified. Message, client. Address) 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 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 v server accepts connect by: § creating new connection -specific socket § allows server to talk with multiple clients 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: server. Socket = Server. Socket() wait for incoming TCP connection request connection. Socket = connection server. Socket. accept() read request from connection. Socket write reply to connection. Socket close connection. Socket setup create socket, connect to hostid, port=x client. Socket = socket() send request using client. Socket read reply from client. Socket close client. Socket Application Layer 2 -12
Example: Java client (TCP) import java. io. *; import java. net. *; class TCPClient { create input stream create client. Socket object of type Socket, connect to server create output stream attached to socket this package defines Socket() and Server. Socket() classes public static void main(String argv[]) throws Exception { server name, String sentence; e. g. , www. umass. edu String modified. Sentence; server port # Buffered. Reader in. From. User = new Buffered. Reader(new Input. Stream. Reader(System. in)); Socket client. Socket = new Socket("hostname", 6789); Data. Output. Stream out. To. Server = new Data. Output. Stream(client. Socket. get. Output. Stream()); Application Layer 2 -13
Example: Java client (TCP) Buffered. Reader in. From. Server = new Buffered. Reader(new Input. Stream. Reader(client. Socket. get. Input. Stream())); create input stream attached to socket sentence = in. From. User. read. Line(); send line to server out. To. Server. write. Bytes(sentence + 'n'); read line from server modified. Sentence = in. From. Server. read. Line(); System. out. println("FROM SERVER: " + modified. Sentence); close socket client. Socket. 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 client. Sentence; String capitalized. Sentence; Server. Socket welcome. Socket = new Server. Socket(6789); while(true) { Socket connection. Socket = welcome. Socket. accept(); Buffered. Reader in. From. Client = new Buffered. Reader(new Input. Stream. Reader(connection. Socket. get. Input. Stream())); Application Layer 2 -15
Example: Java server (TCP) create output stream, attached to socket Data. Output. Stream out. To. Client = new Data. Output. Stream(connection. Socket. get. Output. Stream()); read in line from socket client. Sentence = in. From. Client. read. Line(); capitalized. Sentence = client. Sentence. to. Upper. Case() + 'n'; write out line to socket out. To. Client. write. Bytes(capitalized. Sentence); } } } end of while loop, loop back and wait for another client connection Application Layer 2 -16
Example app: TCP client Python TCPClient import socket server. Name = ‘servername’ create TCP socket for server, remote port 12000 server. Port = 12000 client. Socket = socket(socket. AF_INET, socket. SOCK_STREAM) client. Socket. connect((server. Name, server. Port)) No need to attach server name, port sentence = raw_input(‘Input lowercase sentence: ’) client. Socket. send(sentence) modified. Sentence = client. Socket. recv(1024) print ‘From Server: ’, modified. Sentence client. Socket. 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 * server. Port = 12000 server. Socket = socket(AF_INET, SOCK_STREAM) server. Socket. bind((‘’, server. Port)) server. Socket. listen(1) print ‘The server is ready to receive’ while 1: connection. Socket, addr = server. Socket. accept() sentence = connection. Socket. recv(1024) capitalized. Sentence = sentence. upper() connection. Socket. send(capitalized. Sentence) connection. Socket. close() Application Layer 2 -18
- Slides: 18