lap trinh socket voi tcp udp

6
12/6/2007 1 1 Network Programming Lập trình Socket với Java 2 Network Programming Nội dung bài học 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 3 Network Programming 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 4 Network Programming Exceptions in Java BindException ConnectException MalformedURLException NoRouteToHostException ProtocolException SocketException UnknownHostException UnknownServiceException 5 Network Programming Lớp InetAddress 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 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() 6 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 chui ký tnhp tbà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); } } }

Upload: hoang-hieu

Post on 07-Nov-2014

94 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Lap Trinh Socket Voi Tcp Udp

12/6/2007

1

1Network Programming

Lập trình Socket với Java

2Network Programming

Nội dung bài học

� 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

3Network Programming

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

4Network Programming

Exceptions in Java� BindException

� ConnectException

� MalformedURLException

� NoRouteToHostException

� ProtocolException

� SocketException

� UnknownHostException

� UnknownServiceException

5Network Programming

Lớp InetAddress� 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 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 UnknownHostExceptionpublic 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()

6Network 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);}

}}

Page 2: Lap Trinh Socket Voi Tcp Udp

12/6/2007

2

7Network Programming

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!");}

}}

8Network Programming

Truyền tin với giao thức TCPTCP client

TCP server

socket()ServerSocket ()

ServerSocket.

accept()

BufferedReader.readLine()

PrintWriter.println()

read()

connect()

write()

close()

Connection

request

EOF

Wait next

request

Process request

data (request)

data (reply)

BufferedReader.readLine()

ServerSocket.

close()

9Network Programming

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� 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� 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 IOExceptionpublic Socket(String host, int port, InetAddress localAddress, int

localPort) throws IOException

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

10Network Programming

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 IOExceptionpublic OutputStream getOutputStream() throws IOException

� Lấy thông tin về một Socket� public InetAddress getInetAddress( )� public int getPort( ) � public int getLocalPort( )� public InetAddress getLocalAddress( )

� Đóng socket:� 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

11Network Programming

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. Thiết lập các dòng xuất/nhập dữ liệu

3. Gửi và nhận dữ liệu

4. Đóng kết nối

12Network Programming

Ví dụ: DaytimeClient.javaimport 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;

}

Page 3: Lap Trinh Socket Voi Tcp Udp

12/6/2007

3

13Network Programming

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

14Network Programming

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

15Network 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 Socket

� public void close() throws IOException

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

16Network Programming

TCP SocketsMÁY CHỦ:

1. Tạo một đối tượng ServerSocketServerSocket servSocket = new ServerSocket(1234);

2. Đưa máy chủ vào trạng thái chờSocket link = servSocket.accept();

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

4. Gửi và nhận dữ liệu

out.println(awaiting data…);String input = in.readLine();

5. Đóng kết nối

link.close()

17Network Programming

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

� Sử dụng hàm getInputStream and getOutputStream of classSocket để 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);

18Network Programming

Ví dụ về máy chủ TCP Echoimport java.net.*; // need this for InetAddress, Socket, ServerSocketimport java.io.*; // need this for I/O stuff

public class TCPEchoServer {static final int BUFSIZE=1024; // define a constant used as size of bufferstatic 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);

}}

Page 4: Lap Trinh Socket Voi Tcp Udp

12/6/2007

4

19Network Programming

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 addressSystem.out.println("Connection from " + s.getInetAddress().getHostAddress());

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

// read/write loopwhile ((bytesread = in.read(buff)) != -1) {

out.write(buff,0,bytesread);}s.close();

}}

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

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

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

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

24Network Programming

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

Page 5: Lap Trinh Socket Voi Tcp Udp

12/6/2007

5

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

26Network Programming

Các bước thiết lập truyền tin UDP - MÁY CHỦ1. Khởi tạo một đối tượng kiểu DatagramSocket

DatagramSocket dgramSocket = new DatagramSocket(1234);

2. Tạo buffer cho dòng dữ liệu nhậpbyte[] buffer = new byte[256];

3. Tạo đối tượng kiểu DatagramPacket cho dòng dữ liệu nhập

DatagramPacket inPacket =

new DatagramPacket(buffer, buffer.length);

4. Chờ dòng dữ liệu nhập

dgramSocket.receive(inPacket)

27Network Programming

Các bước thiết lập truyền tin UDP - MÁY CHỦ(2)5. 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();

6. Lấy dữ liệu từ bufferstring message = new String(inPacket.getData(), 0, inPacket.getLength());

7. Tạo gói dữ liệu UDP xuất

DatagramPacket outPacket = new DatagramPacket(

response.getBytes(), response.length(),clientAddress, clientPort);

8. Gửi gói dữ liệu dgramSocket.send(outPacket)

9. Đóng DatagramSocket:

dgramSocket.close();

28Network Programming

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

1. Tạo đối tượng kiểu DatagramSocket

DatagramSocket dgramSocket = new DatagramSocket;

2. Tạo gói dữ liệu UDP xuất

DatagramPacket outPacket = new DatagramPacket(message.getBytes(),

message.length(),host, port);

3. Gửi gói dữ liệudgramSocket.send(outPacket)

4. Tạo buffer cho dữ liệu nhậpbyte[] buffer = new byte[256];

29Network Programming

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

5. Tạo đối tượng kiểu DatagramPacket cho gói dữ liệu nhập

DatagramPacket inPacket = new DatagramPacket(buffer, buffer.length);

6. Nhận gói dữ liệu nhập

dgramSocket.receive(inPacket)

7. Lấy dữ liệu từ bufferstring response = new String(inPacket.getData(), 0,

inPacket.getLength());

8. Đóng DatagramSocket:

dgramSocket.close();

30Network Programming

Ví dụ về máy chủ UDPimport 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}

Page 6: Lap Trinh Socket Voi Tcp Udp

12/6/2007

6

31Network 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 trycatch (SocketException ex) {

System.err.println(ex);} // end catch

} // end main}

32Network Programming

Ví dụ về máy kháchUDPimport 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";}

33Network 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}