1 / 22

Socket Programming in Java CS587x Lecture 4 Department of Computer Science Iowa State University

Socket Programming in Java CS587x Lecture 4 Department of Computer Science Iowa State University. What We Will Discuss Today. TCP stream java.net.Socket java.net.ServerSocket UDP packet Java.net.DatagramPacket java.net.DatagramSocket A Look at A Real Project Homework #1. Socket.

keyss
Download Presentation

Socket Programming in Java CS587x Lecture 4 Department of Computer Science Iowa State University

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Socket Programming in Java CS587x Lecture 4 Department of Computer Science Iowa State University

  2. What We Will Discuss Today • TCP stream • java.net.Socket • java.net.ServerSocket • UDP packet • Java.net.DatagramPacket • java.net.DatagramSocket • A Look at A Real Project • Homework #1

  3. Socket • java.net.Socket is used by clients to make a bi-directional connection with server • Socket constructors • Socket(String hostname, int port) • Socket(InetAddress addr, int port) • Socket(String hostname, int port, InetAddress localAddr, int localPort) • Socket(InetAddress addr, int port, InetAddress localAddr, int localPort) • Creating socket Socket csweb = new Socket(“www.cs.iastate.edu", 80);

  4. Some Comments on Socket • Socket() attempts to connect the underlying socket to the remote server • No separate connect() method • Cannot set or change remote host and port • Socket constructors may block while waiting for the remote host to respond • Depends on operating systems and timeout settings • When performance is critical, programmer may want to create a separate thread to create a Socket

  5. Sending and Receiving Data • Data is sent and received with output and input streams • There are methods to get an input stream for a socket and an output stream for the socket public InputStream getInputStream() public OutputStream getOutputStream() • There's also a method to close a socket: public synchronized void close()

  6. Socket Input & Output try { String s; Socket socket = new Socket(“www.cs.iastate.edu”, 80); BufferedReader reader = new BufferedReader( new InputStreamReader(socket.getInputStream())); PrintStream pstream = new PrintStream(socket.getOutputStream()); pstream.println(“GET /”); while ((s = reader.readLine()) != null) { System.out.println(s); } } catch (Exception e) { System.err.println(“Error: “ + e); }

  7. Some Socket Options • void setKeepAlive() • void setReceiveBufferSize() • void setSendBufferSize() • void setTcpNoDelay() • void setSoTimeout()

  8. ServerSocket • ServerSocket is used to by server to accept client connections • ServerSocket constructor public ServerSocket(int port) public ServerSocket(int port, int backlog) public ServerSocket(int port, int backlog, InetAddress networkInterface) • Creating a ServerSocket ServerSocket ss = new ServerSocket(80, 50); • A closed ServerSocket cannot be reopened

  9. Reading Data with a ServerSocket • ServerSocket objects use their accept() method to connect to a client public Socket accept() • accept() returns a Socket object, and its getInputStream() and getOutputStream() methods provide streams • There are no getInputStream() or getOutputStream() methods for ServerSocket

  10. A Simple Server try { ServerSocket ss = new ServerSocket(2345); Socket s = ss.accept(); PrintWriter pw = new PrintWriter(s.getOutputStream()); pw.println("Hello There!"); pw.println("Goodbye now."); s.close(); } catch (IOException ex) { System.err.println(ex); }

  11. DatagramPacket • Constructor for receiving public DatagramPacket(byte[] data, int length) • Constructor for sending public DatagramPacket(byte[] data, int length, InetAddress addr, int port) • DatagramPacket Objects can be reused public synchronized void setAddress(InetAddress addr) public synchronized void setPort(int port) public synchronized void setData(byte data[]) public synchronized void setLength(int length)

  12. DatagramSocket • Constructor for sending public DatagramSocket() • Constructor for receiving public DatagramSocket(int port) public DatagramSocket(int port, InetAddress addr)

  13. Sending UDP Datagrams • Convert the data into byte array. • Create a DatagramPacket using the array • Create a DatagramSocket using the packet and then call send() method Example InetAddress dst = new InetAddess(“cs.iastate.edu"); String s = “This is my datagram packet" byte[] b = s.getBytes(); DatagramPacket dp = new DatagramPacket(b, b.length, dst, 2345); DatagramSocket sender = new DatagramSocket(); sender.send(dp);

  14. Receiving UDP Datagrams • Construct a DatagramSocket object on the port on which you want to listen • Pass an empty DatagramPacket object to the DatagramSocket's receive() method public synchronized void receive(DatagramPacket dp) • The calling thread blocks until a datagram is received • dp is filled with the data from that datagram • Notes: • Use getPort() and getAddress() to tell where the packet came from, getData() to retrieve the data, and getLength() to see how many bytes were in the data • The received packet could be truncated to fit the buffer

  15. Example of Receiving Datagram try { byte buffer = new byte[1024]; DatagramPacket incoming = new DatagramPacket(buffer, buffer.length); DatagramSocket ds = new DatagramSocket(2345); ds.receive(incoming); byte[] data = incoming.getData(); String s = new String(data, 0, incoming.getLength()); System.out.println("Port" + incoming.getPort() + " on " + incoming.getAddress() + " sent this message:"); System.out.println(s); } catch …

  16. A Mistake You Want to Avoid byte[] buf = new byte[1024]; DatagramPacket incoming = new DatagramPacket(buf, buf.length); DatagramSocket ds = new DatagramSocket(2345); for (;;) { ds.receive(incoming); byte[] data = incoming.getData(); new DataProcessor(data).start(); } class DataProcessor(byte[] data) extends Thread { // processing data[] … }

  17. Correct Way byte[] buf = new byte[1024]; DatagramPacket incoming = new DatagramPacket(buf, buf.length); DatagramSocket ds = new DatagramSocket(2345); for (;;) { ds.receive(incoming); byte[] data = new byte[incoming.getLength()]; System.arraycopy(incoming.getData(), 0, data, 0, data.length); new DataProcessor(data).start(); } class DataProcessor(byte[] data) extends Thread { // processing data[] … }

  18. Redundant Array of Inexpensive Disk • RAID Management • Monitor the health condition of RAID subsystems • disks, fans, power supplies, temperatures, etc. • Report any failure instantly • Provide disaster recovery • array rebuild, spare disks reassign, etc.

  19. Remote and Centralized Storage Management

  20. Homework #1 Assigned on Monday, August 30, 2004 Due on 3:00PM, Wednesday, Sept. 15, 2004 Client (C code) (UDP) Send beacon every minute Server (java code) (TCP) Send command and get result back

  21. Client Design: Two Threads • BeaconSender: Send the following message to server every minute using UDP datagram struct BEACON { int ID; // randomly generated during startup int StartUpTime; // the time when the client starts char IP[4]; // the IP address of this client int CmdPort; // the client listens to this port for cmd } • CmdAgent: Receive and execute remote commands and send results back using TCP socket. You implement two commands: (1) void GetLocalOS(char OS[16], int *valid) // OS[16] contains the local operation system name // valid = 1 indicates OS is valid (2) void GetLocalTime(int *time, int *valid) // time contains the current system clock // valid = 1 indicates time is valid

  22. Server Design • BeaconListener thread • Receive beacons sent by clients • For each new client, spawn a thread called ClientAgent • ClientAgent(beacon) thread • Send command GetLocalOS() to the corresponding client • Get the result back and display the OS • Send command GetLocalTime() to the corresponding client • Get the result back and display the execution time

More Related