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

Network Programming

1

Network Programming

2

Các classes trong gói java.net
Gói java.net chứa các classes cho phép thực hiện lập trình mạng
ContentHandler DatagramPacket DatagramSocket InetAddress MulticastSocket ServerSocket Socket SocketImpl URL URLConnection URLEncoder URLStreamHandler

Exceptions in Java
BindException ConnectException MalformedURLException NoRouteToHostException ProtocolException SocketException UnknownHostException UnknownServiceException
3
Network Programming

Network Programming

4

Lớp InetAddress
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

import java.net.*; import java.io.*; public class IPFinder { public static void main(String[] args) throws IOException { String host; BufferedReader input = new BufferedReader( new InputStreamReader(System.in)); 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); } } }

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*/

5

Network Programming

6

1

12/6/2007

Lấy địa chỉ của máy chủ
import java.net.*; 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!"); } } }

Truyền tin với giao thức TCP
TCP server TCP client
ServerSocket () socket() ServerSocket. accept()

connect()

Connection request data (request)

write()

BufferedReader. readLine() Process request PrintWriter. println() BufferedReader. readLine() ServerSocket. close()

Wait next request

read()

data (reply)
EOF

close()

Network Programming

7

Network Programming

8

Lớp Java.net.Socket
Lớp cơ bảncủa Java để thực hiện truyền tin TCP phía máy khách Kết nối được thiết lập khi khởi tạo đối tượng
Thiết lập hoặc ngắt kết nối và thiết lập các tùy chọn 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
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

The Java.net.Socket Class (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
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 public InetAddress getInetAddress( ) public int getPort( ) public int getLocalPort( ) public InetAddress getLocalAddress( ) 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

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

Đóng socket:

Network Programming

9

Network Programming

10

TCP Sockets
MÁY KHÁCH: 1. Thi t l p k t n i n máy ch
Socket link = new Socket(inetAddress.getLocalHost(),1234);
2. 3. 4.

Ví dụ: DaytimeClient.java
import java.net.*; import java.io.*; 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; }

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

11

Network Programming

12

2

12/6/2007

Example: DaytimeClient.java (2)
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

Lớp Java.net.ServerSocket
L p java.net.ServerSocket bao g m
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( )

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

Network Programming

13

Network Programming

14

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 Socket

TCP Sockets
MÁY CH : 1. T om t
2.

i tư ng ServerSocket

ServerSocket servSocket = new ServerSocket(1234);

3. 4.

public void close() throws IOException
óng socket máy ch và gi i phóng c ng ch

5.

ư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()
Network Programming

Network Programming

15

16

Thiết lập dòng xuất/nhập dữ liệu
Khi m t socket ư c k t n i
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

Ví dụ về máy chủ TCP Echo
import java.net.*; import java.io.*; // 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

17

Network Programming

18

3

12/6/2007

Ví dụ về máy chủ TCP Echo(2)
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()); // Set up streams InputStream in = s.getInputStream(); OutputStream out = s.getOutputStream(); // read/write loop while ((bytesread = in.read(buff)) != -1) { out.write(buff,0,bytesread); } s.close(); } }

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 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 IP

Network Programming

19

Network Programming

20

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

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

21

Network Programming

22

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

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 t o ra
i tư ng ki u DatagramPacket ư c

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 DatagramSocket() throws SocketException public DatagramSocket(int port) throws SocketException public DatagramSocket(int port, InetAddress laddr) throws SocketException
Network Programming

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
23

a ch IP mà socket ang s d ng
24

Network Programming

4

12/6/2007

Đ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 Không gi ng như k t n i TCP nh trư c

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

2.

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

3.

4.

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)

Network Programming

25

Network Programming

26

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

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

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

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

3.

9.

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

4.

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

Network Programming

28

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

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 }

6.

7.

8.

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

29

Network Programming

30

5

12/6/2007

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 }

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

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

Sign up to vote on this title
UsefulNot useful