Bài giảng Lập trình mạng - Nguyễn Hoài Sơn - Lập trình Socket với Java
Giới thiệu gói java.net
Lớp InetAddress
Truyền tin với giao thức TCP
TCP Sockets
Ví dụ về máy chủ/khách TCP
Truyền tin với giao thức UDP
Datagram Sockets
Ví dụ về máy chủ/khách UDP
time.toString( ).trim( ); System.out.println("It is " + timeString + " at " + hostname); } // end try catch (UnknownHostException ex) { System.err.println(ex); } catch (IOException ex) { System.err.println(ex); } } // end main } // end DaytimeClient Network Programming Thiết lập tùy chọn socket TCP_NODELAY public void setTcpNoDelay(boolean on) throws SocketException public boolean getTcpNoDelay( ) throws SocketException SO_REUSEADDR // Java 1.4 public void setReuseAddress(boolean on) throws SocketException public boolean getReuseAddress( ) throws SocketException SO_TIMEOUT public void setSoTimeout(int milliseconds) throws SocketException Public int getSoTimeout( ) throws SocketException SO_LINGER public void setSoLinger(boolean on, int seconds) throws SocketException public int getSoLinger( ) throws SocketException SO_SNDBUF/ SO_RCVBUF (Java 1.2 and later) public void setReceiveBufferSize(int size) throws SocketException, IllegalArgumentException public int getReceiveBufferSize( ) throws SocketException SO_KEEPALIVE (Java 1.3 and later) public void setKeepAlive(boolean on) throws SocketException public boolean getKeepAlive( ) throws SocketException Network Programming Lập trình máy chủ TCP- Lớp Java.net.ServerSocket Các bước thiết lập máy chủ Tạo một đối tượng ServerSocket sử dụng hàm khởi tạo ServerSocket( ) ServerSocket chờ kết nối từ phía máy khách bằng hàm accept() Trả về một đối tượng Socket kết nối giữa máy khách và máy chủ Thiết lập các dòng xuất/nhập dữ liệu Gửi và nhận dữ liệu Đóng kết nối Network Programming Lớp Java.net.ServerSocket Có bốn hàm khởi tạo ServerSocket cho phép thiết lập cổng, kích thước hàng đợi của các yêu cầu kết nối và network interface gán cho tiến trình máy chủ public ServerSocket(int port) throws BindException, IOException public ServerSocket(int port, int backlog) throws BindException, IOException public ServerSocket(int port, int backlog, InetAddress bindAddr) throws BindException, IOException public ServerSocket( ) throws IOException // Java 1.4 Network Programming Lớp Java.net.ServerSocket - Chấp nhận và đóng kết nối public Socket accept() throws IOException Dừng thực hiện của tiến trình và đợi kết nối từ máy khách Khi có một máy khách kết nối đến, hàm accept( ) sẽ trả về một đối tượng kiểu Socket Chú ý xử lý các loại ngoại lệ khác nhau public void close() throws IOException Đóng socket máy chủ và giải phóng cổng chờ Network Programming Ví dụ về máy chủ DaytimeServer import java.net.*; import java.io.*; import java.util.Date; public class DaytimeServer { public final static int DEFAULT_PORT = 13; public static void main(String[] args) { int port = DEFAULT_PORT; if (args.length > 0) { try { port = Integer.parseInt(args[0]); if (port = 65536) { System.out.println("Port must between 0 and 65535"); return; } } catch (NumberFormatException ex) { // use default port } } Network Programming try { ServerSocket server = new ServerSocket(port); Socket connection = null; while (true) { try { connection = server.accept( ); Writer out = new OutputStreamWriter(connection.getOutputStream( )); Date now = new Date( ); out.write(now.toString( ) +"\r\n"); out.flush( ); connection.close( ); } catch (IOException ex) {} finally { try { if (connection != null) connection.close( ); } catch (IOException ex) {} } } // end while } // end try catch (IOException ex) { System.err.println(ex); } // end catch } // end main } // end DaytimeServer Network Programming Lớp Java.net.ServerSocket – Lấy thông tin về socket public InetAddress getInetAddress( ) public int getLocalPort( ) Network Programming Lớp Java.net.ServerSocket – Tùy biến socket SO_TIMEOUT public void setSoTimeout(int timeout) throws SocketException public int getSoTimeout( ) throws IOException SO_REUSEADDR public void setReuseAddress(boolean on) throws SocketException public boolean getReuseAddress( ) throws SocketException SO_RCVBUF public void setReceiveBufferSize(int size) throws SocketException, IllegalArgumentException public int getReceiveBufferSize( ) throws SocketException Network Programming Truyền tin với giao thức UDP Network Programming Lớp java.net.DatagramPacket Biểu diễn các gói dữ liệu UDP Cung cấp các hàm Lấy và thiết lập địa chỉ đích/nguồn từ/vào tiêu đề IP Lấy và thiết lập cổng giao tiếp đích/nguồn Nhận và thiết lập gói dữ liệu UDP Network Programming Hàm khởi tạo DatagramPacket Với bên nhận: DatagramPacket(byte[] buf, int len); Với bên gửi: DatagramPacket( byte[] buf, int len InetAddress a, int port); Network Programming Các hàm DatagramPacket byte[] getData(); void setData(byte[] buf); void setAddress(InetAddress a); void setPort(int port); InetAddress getAddress(); int getPort(); Địa chỉ đích Có thể là địa chỉ/cổng nguồn/đích Network Programming Lớp DatagramSocket Tạo datagram socket để nhận DatagramPacket. Không có phân biệt giữa socket máy khách và socket máy chủ Một DatagramSocket có thể gửi cho nhiều địa chỉ đích khác nhau. Địa chỉ đích được lưu tại DatagramPacket public DatagramSocket() throws SocketException public DatagramSocket(int port) throws SocketException public DatagramSocket(int port, InetAddress laddr) throws SocketException Network Programming Lớp DatagramSocket – Gửi và nhận gói dữ liệu UDP public void send(DatagramPacket dp) throws IOException Gửi gói dữ liệu UDP với đối tượng kiểu DatagramPacket được tạo ra public void receive(DatagramPacket dp) throws IOException Nhận gói dữ liệu UDP và lưu lại tại đối tượng kiểu DatagramPacket được tạo ra từ trước public void close( ) Giải phóng cổng đang đựoc sử dụng bới socket đó public int getLocalPort( ) Trả về số hiệu cổng mà socket đang sử dụng public InetAddress getLocalAddress( ) Trả về địa chỉ IP mà socket đang sử dụng Network Programming Điều khiển kết nối – với Java 1.2 public void connect(InetAddress host, int port) Gửi và nhận gói tin từ một điạ chỉ IP và cổng được định trước Không giống như kết nối TCP public void disconnect( ) public int getPort( ) public InetAddress getInetAddress( ) public InetAddress getRemoteSocketAddress( ) // Java 1.4 Network Programming Các bước thiết lập truyền tin UDP - MÁY CHỦ Khởi tạo một đối tượng kiểu DatagramSocketDatagramSocket dgramSocket = new DatagramSocket(1234); Tạo buffer cho dòng dữ liệu nhậpbyte[] buffer = new byte[256]; Tạo đối tượng kiểu DatagramPacket cho dòng dữ liệu nhập DatagramPacket inPacket = new DatagramPacket(buffer, buffer.length); Chờ dòng dữ liệu nhậpdgramSocket.receive(inPacket) Network Programming Các bước thiết lập truyền tin UDP - MÁY CHỦ(2) Lấy địa chỉ và cổng của bên gửi từ gói tin nhận đượcInetAddress clientAddress = inPacket.getAddress();int clientPort = inPacket.getPort(); Lấy dữ liệu từ bufferstring message = new String(inPacket.getData(), 0, inPacket.getLength()); Tạo gói dữ liệu UDP xuất DatagramPacket outPacket = new DatagramPacket( response.getBytes(), response.length(), clientAddress, clientPort); Gửi gói dữ liệu dgramSocket.send(outPacket) Đóng DatagramSocket: dgramSocket.close(); Network Programming Các bước thiết lập truyền tin UDP – Máy khách (1) Tạo đối tượng kiểu DatagramSocketDatagramSocket dgramSocket = new DatagramSocket; Tạo gói dữ liệu UDP xuấtDatagramPacket outPacket = new DatagramPacket( message.getBytes(), message.length(), host, port); Gửi gói dữ liệudgramSocket.send(outPacket) Tạo buffer cho dữ liệu nhập byte[] buffer = new byte[256]; Network Programming Các bước thiết lập truyền tin UDP – Máy khách (2) Tạo đối tượng kiểu DatagramPacket cho gói dữ liệu nhập DatagramPacket inPacket = new DatagramPacket(buffer, buffer.length); Nhận gói dữ liệu nhập dgramSocket.receive(inPacket) Lấy dữ liệu từ buffer string response = new String(inPacket.getData(), 0, inPacket.getLength()); Đóng DatagramSocket: dgramSocket.close(); Network Programming Ví dụ về máy chủ UDP import java.net.*; import java.io.*; public class UDPDiscardServer { public final static int DEFAULT_PORT = 9; public final static int MAX_PACKET_SIZE = 65507; public static void main(String[] args) { int port = DEFAULT_PORT; byte[] buffer = new byte[MAX_PACKET_SIZE]; try { port = Integer.parseInt(args[0]); } catch (Exception ex) { // use default port } Network Programming Ví dụ về máy chủ UDP(2) try { DatagramSocket server = new DatagramSocket(port); DatagramPacket packet = new DatagramPacket(buffer, buffer.length); while (true) { try { server.receive(packet); String s = new String(packet.getData( ), 0, packet.getLength( )); System.out.println(packet.getAddress( ) + " at port " + packet.getPort( ) + " says " + s); // packet.setLength(buffer.length); // reset the length for the next packet } catch (IOException ex) { System.err.println(ex); } } // end while } // end try catch (SocketException ex) { System.err.println(ex); } // end catch } // end main } Network Programming Ví dụ về máy kháchUDP import java.net.*; import java.io.*; public class UDPDiscardClient { public final static int DEFAULT_PORT = 9; public static void main(String[] args) { String hostname; int port = DEFAULT_PORT; if (args.length > 0) { hostname = args[0]; try { port = Integer.parseInt(args[1]); } catch (Exception ex) { // use default port } } else { hostname = "localhost"; } Network Programming Ví dụ về máy khách UDP(2) try { InetAddress server = InetAddress.getByName(hostname); BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in)); DatagramSocket theSocket = new DatagramSocket( ); while (true) { String theLine = userInput.readLine( ); if (theLine.equals(".")) break; byte[] data = theLine.getBytes( ); DatagramPacket theOutput = new DatagramPacket(data, data.length, server, port); theSocket.send(theOutput); } // end while } // end try catch (UnknownHostException uhex) { System.err.println(uhex); } catch (SocketException socex) { System.err.println(socex); } catch (IOException ioex) { System.err.println(ioex); } } // end main }
File đính kèm:
- Bài giảng Lập trình mạng - Nguyễn Hoài Sơn - Lập trình Socket với Java.ppt