Lap Trinh Socket Voi Java3

  • Uploaded by: HocLieuMo
  • 0
  • 0
  • October 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Lap Trinh Socket Voi Java3 as PDF for free.

More details

  • Words: 2,137
  • Pages: 6
12/6/2007

Nội dung bài học

Lập trình Socket với Java

 

Lớp InetAddress Truyền tin với giao thức TCP  



Truyền tin với giao thức UDP  

Network Programming





        

ContentHandler DatagramPacket DatagramSocket InetAddress MulticastSocket ServerSocket Socket SocketImpl URL URLConnection URLEncoder URLStreamHandler

     

Network Programming

Network Programming

4

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

Xử lý địa chỉ Internet theo tên và địa chỉ IP Các hàm chuyển đổi tên/địa chỉ: /* trả về một đối tượng kiểu InetAddress*/

public class IPFinder { public static void main(String[] args) throws IOException { String host; BufferedReader input = new BufferedReader( new InputStreamReader(System.in));

public static InetAddress getByName(String host) throws UnknownHostException /* trả về chuỗi đối tượng kiểu InetAddress*/ public static InetAddress[] getAllByName(String host) throws UnknownHostException public static InetAddress getLocalHost() throws UnknownHostException public boolean isMulticastAddress() public String getHostName() /*trả về tên miền*/ public byte[] getAddress() /*trả về địa chỉ IP dạng chuỗi byte*/ public String getHostAddress() /*trả về địa chỉ IP dạng ký tự*/ public int hashCode() public boolean equals(Object obj) public String toString() Network Programming

BindException ConnectException MalformedURLException NoRouteToHostException ProtocolException SocketException UnknownHostException UnknownServiceException

3

Lớp InetAddress 

2

Exceptions in Java 





Network Programming

Gói java.net chứa các classes cho phép thực hiện lập trình mạng 

Datagram Sockets Ví dụ về máy chủ/khách UDP

1

Các classes trong gói java.net 

TCP Sockets Ví dụ về máy chủ/khách TCP

System.out.print("\n\nEnter host name: "); host = input.readLine(); /*Đọc chuỗi ký tự nhập từ bàn phím*/ try { InetAddress address = InetAddress.getByName(host); System.out.println("IP address: " + address.toString()); } catch (UnknownHostException e) { System.out.println("Could not find " + host); } } }

5

Network Programming

6

1

12/6/2007

Truyền tin với giao thức TCP

Lấy địa chỉ của máy chủ import java.net.*;

TCP server

public class MyLocalIPAddress { public static void main(String[] args) { try { InetAddress address = InetAddress.getLocalHost(); System.out.println (address.toString()); } catch (UnknownHostException e) { System.out.println("Could not find local address!"); } } }

TCP client ServerSocket () socket()

Connection request

connect()

data (request)

write()

ServerSocket. accept()

BufferedReader. readLine() Process request

data (reply)

read()

EOF

close()

PrintWriter. println()

Wait next request

BufferedReader. readLine() ServerSocket. close()

Network Programming

7

Lớp Java.net.Socket 









Mỗi đối tượng Socket được gán với một máy chủ duy nhất Để kết nối với một máy chủ khác, phải tạo ra một đối tượng Socket mới



  

Network Programming



   

Network Programming

10

Ví dụ: DaytimeClient.java import java.net.*; import java.io.*;

Socket link = new Socket(inetAddress.getLocalHost(),1234);

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

public void close() throws IOException public void shutdownInput( ) throws IOException // Java 1.3 public void shutdownOutput( ) throws IOException // Java 1.3 public boolean isInputShutdown( ) // Java 1.4 public boolean isOutputShutdown( ) // Java 1.4

9

MÁY KHÁCH: 1. Thiết lập kết nối đến máy chủ

4.

public InetAddress getInetAddress( ) public int getPort( ) public int getLocalPort( ) public InetAddress getLocalAddress( )

Đóng socket: 

TCP Sockets

3.

Có một số hàm để lấy đối tượng là dòng nhập cho một socket và dòng xuất cho socket đó. public InputStream getInputStream() throws IOException public OutputStream getOutputStream() throws IOException

Lấy thông tin về một Socket 

public Socket(String host, int port) throws UnknownHostException, IOException public Socket(InetAddress address, int port) throws IOException public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException public Socket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException

2.

Gửi và nhận dữ liệu được thực hiện thông qua dòng dữ liệu xuất/nhập

Thiết lập hoặc ngắt kết nối và thiết lập các tùy chọn socket

Kết nối được thiết lập khi khởi tạo đối tượng 

8

The Java.net.Socket Class (2)

Lớp cơ bảncủa Java để thực hiện truyền tin TCP phía máy khách 

Network Programming

11

public class DaytimeClient { public static void main(String[] args) { String hostname; int port; if (args.length > 0) { hostname = args[0]; port = Integer.parseInt(args[1]); } else { hostname = "time.nist.gov"; port = 13; }

Network Programming

12

2

12/6/2007

Lớp Java.net.ServerSocket

Example: DaytimeClient.java (2)

Lớp java.net.ServerSocket bao gồm



try { Socket theSocket = new Socket(hostname, port); InputStream timeStream = theSocket.getInputStream( ); StringBuffer time = new StringBuffer( ); int c; while ((c = timeStream.read( )) != -1) time.append((char) c); String timeString = 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

   

  







Network Programming

MÁY CHỦ: 1. Tạo một đối tượng ServerSocket ServerSocket servSocket = new ServerSocket(1234);

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 Socket

2.

3. 4.

Đóng socket máy chủ và giải phóng cổng chờ 5.

Network Programming





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

chúng ta có thể gửi dữ liệu thông qua một dòng xuất dữ liệu chúng ta có thể nhận dữ liệu thông qua một dòng nhập dữ liệu

16

// need this for InetAddress, Socket, ServerSocket // need this for I/O stuff

public class TCPEchoServer { static final int BUFSIZE=1024; // define a constant used as size of buffer static public void main(String args[]) { if (args.length != 1) { throw new IllegalArgumentException("Must specify a port!"); } int port = Integer.parseInt(args[0]); try { ServerSocket ss = new ServerSocket(port); // Create Server Socket (passive socket) while (true) { Socket s = ss.accept(); handleClient(s); } } catch (IOException e) { System.out.println("Fatal I/O Error !"); System.exit(0); } }

Sử dụng hàm getInputStream and getOutputStream of class Socket để thiết lập dòng xuất/nhập dữ liệu BufferedReader in = new BufferedReader( new InputStreamReader(link.getInputStream())); PrintWriter out = new PrintWriter(link.getOutputStream(),true);

Network Programming

Network Programming

Ví dụ về máy chủ TCP Echo

Khi một socket được kết nối 

Đưa máy chủ vào trạng thái chờ Socket link = servSocket.accept(); Thiết lập các dòng xuất/nhập dữ liệu Gửi và nhận dữ liệu out.println(awaiting data…); String input = in.readLine(); Đóng kết nối link.close()

15

Thiết lập dòng xuất/nhập dữ liệu 

14

TCP Sockets

public void close() throws IOException 

public ServerSocket(int port) throws IOException public ServerSocket(int port, int backlog) throws IOException public ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException public ServerSocket( ) throws IOException // Java 1.4

13

public Socket accept() throws IOException 

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ủ



Lớp Java.net.ServerSocket - Chấp nhận và đóng kết nối 

Các hàm khởi tạo đối tượng ServerSocket Các hàm chờ kết nối Các hàm thiết lập các loại tùy chọn socket máy chủ Các hàm thường dùng khác như toString( )

17

Network Programming

18

3

12/6/2007

Ví dụ về máy chủ TCP Echo(2)

Lớp java.net.DatagramPacket

static void handleClient(Socket s) throws IOException { byte[] buff = new byte[BUFSIZE]; int bytesread = 0;

 

// print out client's address System.out.println("Connection from " + s.getInetAddress().getHostAddress());

Biểu diễn các gói dữ liệu UDP Cung cấp các hàm  

// Set up streams InputStream in = s.getInputStream(); OutputStream out = s.getOutputStream();



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

// read/write loop while ((bytesread = in.read(buff)) != -1) { out.write(buff,0,bytesread); } s.close(); } }

Network Programming

19

Hàm khởi tạo DatagramPacket

20

Network Programming

Các hàm DatagramPacket

Với bên nhận: DatagramPacket(byte[] buf, int len);

byte[] getData(); void setData(byte[] buf);

Với bên gửi: DatagramPacket( byte[] buf, int len InetAddress a, int port);

void setAddress(InetAddress a); void setPort(int port); InetAddress getAddress(); int getPort();

Network Programming

21





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. 



Network Programming

Tạo datagram socket để nhận DatagramPacket. 

22

public void send(DatagramPacket dp) throws IOException 





public DatagramSocket() throws SocketException public DatagramSocket(int port) throws SocketException public DatagramSocket(int port, InetAddress laddr) throws SocketException

Trả về số hiệu cổng mà socket đang sử dụng

public InetAddress getLocalAddress( ) 

23

Giải phóng cổng đang đựoc sử dụng bới socket đó

public int getLocalPort( ) 



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( ) 



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 

Địa chỉ đích được lưu tại DatagramPacket

Network Programming

Có th là đa ch/cng ngun/đích

Gửi và nhận gói dữ liệu UDP

Lớp DatagramSocket 

Đa ch đích

Trả về địa chỉ IP mà socket đang sử dụng

Network Programming

24

4

12/6/2007

Điều khiển kết nối – với Java 1.2

Các bước thiết lập truyền tin UDP - MÁY CHỦ 1.



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

2.

public void disconnect( ) public int getPort( ) public InetAddress getInetAddress( ) public InetAddress getRemoteSocketAddress( ) // Java 1.4

3.

4.

Network Programming

25

6.

7.

Lấy địa chỉ và cổng của bên gửi từ gói tin nhận được InetAddress clientAddress = inPacket.getAddress(); int clientPort = inPacket.getPort(); Lấy dữ liệu từ buffer string message = new String(inPacket.getData(), 0, inPacket.getLength()); Tạo gói dữ liệu UDP xuất

1.

2.

DatagramPacket outPacket = new DatagramPacket( response.getBytes(), response.length(), clientAddress, clientPort); 8.

9.

3.

Gửi gói dữ liệu dgramSocket.send(outPacket) Đóng DatagramSocket: dgramSocket.close(); Network Programming

4.

6.

7.

8.

Network Programming

28

Ví dụ về máy chủ UDP

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

26

Tạo đối tượng kiểu DatagramSocket DatagramSocket dgramSocket = new DatagramSocket; Tạo gói dữ liệu UDP xuất DatagramPacket outPacket = new DatagramPacket( message.getBytes(), message.length(), host, port); Gửi gói dữ liệu dgramSocket.send(outPacket) Tạo buffer cho dữ liệu nhập byte[] buffer = new byte[256];

27

Các bước thiết lập truyền tin UDP – Máy khách (2) 5.

Network Programming

Các bước thiết lập truyền tin UDP – Máy khách (1)

Các bước thiết lập truyền tin UDP - MÁY CHỦ(2) 5.

Khởi tạo một đối tượng kiểu DatagramSocket DatagramSocket dgramSocket = new DatagramSocket(1234); Tạo buffer cho dòng dữ liệu nhập byte[] 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ập dgramSocket.receive(inPacket)

29

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

30

5

12/6/2007

Ví dụ về máy chủ UDP(2)

Ví dụ về máy kháchUDP

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

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

31

Network Programming

32

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 }

Network Programming

33

6

Related Documents


More Documents from ""

Ltdt6
October 2019 9
Dstt05
October 2019 7
Otmat08
October 2019 10
Otmat04
October 2019 11
Sthc04
October 2019 10
Pluatdc5
October 2019 7