1 / 35

Chapter 7

Chapter 7. Lập trình mạng với Java Lập trình ứng dụng cho UDP GV: Nguyễn Thị Thanh Vân - CNTT. Giao thức UDP . Giao thức UDP : là giao thức đơn giản, phi liên kết và cung cấp dịch vụ trên tầng giao v ận với tốc độ nhanh. Nó hỗ trợ liên kết một-nhiều. Port UDP.

gavan
Télécharger la présentation

Chapter 7

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. Chapter 7 Lập trình mạng với Java Lập trình ứng dụng cho UDP GV: Nguyễn Thị Thanh Vân - CNTT

  2. Giao thức UDP • Giao thức UDP: • là giao thức đơn giản, • phi liên kết và • cung cấp dịch vụ trên tầng giao vận với tốc độ nhanh. • Nó hỗ trợ liên kết một-nhiều

  3. PortUDP • UDP sử dụng các cổng để ánh xạ dữ liệu đến vào một tiến trình cụ thể đang chạy trên một máy tính. • Có 3 loại cổng • Các cổng phổ biến: Từ 0 đến 1023 • Các cổng đã đăng ký: 1024 đến 49151 • Các cổng động/dành riêng 49152 đến 65535

  4. Nhược điểm của UDP so với TCP • Thiếu các tín hiệu bắt tay. • UDP không đảm bảo việc dữ liệu đã đến đích hay chưa • Không sử dụng các phiên (phi liên kết). • Thiếu bảo mật. • Thiếu kiểm soát luồng

  5. Ưu điểm của UDP • Không cần thiết lập liên kết: • nên có thể tránh được thời gian trễ. (dùng trong DNS) • Kích thước header UDP chỉ có 8 byte header cho mỗi đoạn (TCP 24 byte), ref • vì vậy sử dụng băng thông ít hơn.Tốc độ nhanh hơn • Hỗ trợ liên kết 1-1, 1-n. • Sử dụng cho các phương thức truyền broadcasting và multicasting khi chúng ta muốn truyền tin với nhiều host

  6. Ứng dụng của UDP • Nênsử dụng UDP khi: • Không cần thiết lập liên kết • Sử dụng cho các phương thức truyền broadcasting và multicasting khi chúng ta muốn truyền tin với nhiều host. • Kích thước datagram nhỏ và trình tự đoạn là không quan trọng • Ứng dụng không gửi các dữ liệu quan trọng • Không cần truyền lại các gói tin • Băng thông của mạng đóng vai trò quan trọng • Có mộtsố ứng dụng quan trọng dùng UDP, bao gồm DNS, SNMP, DHCP và RIP

  7. Cài đặt ứng dụng UDP trong Java • Hai lớp là DatagramPacket và DatagramSocket. • DatagramPacket : đóng gói các byte dữ liệu vào các gói tin UDP (datagram)và cho phép mở các datagram khi nhận được. • DatagramSocket:thực hiện cả hai nhiệm vụ nhận và gửi gói tin: • Gửi dữ liệu: đặt dữ liệu trong một DatagramPacket và gửi gói tin bằng cách sử dụng DatagramSocket. • Nhận dữ liệu: nhận một đối tượng DatagramPacket từ DatagramSocket và sau đó đọc nội dung của gói tin. (Khác với TCP: Stream. UDP: xử lý từng packet)

  8. DatagramPacket class • Dùng cho một gói dữ liệu đi trên mạng theo kết nối DatagramSocket. • Một gói có thể chứa các thông tin: • các địa chỉ nguồn, đích từ header IP, • cổng nguồn và đích, • độ dài dữ liệu. public final class DatagramPacket extends Object • Lớp này cung cấp các phương thức để nhận và thiết lậpcác thông tin trên • Các trường thông tin còn lại không thể truy nhập được từ mã Java thuần túy.

  9. Khởi tạo datagram để nhận • public DatagramPackage(byte buff[], int len) • public DatagramPackage (byte buff[], int offset, int len) Khi một socket nhận một datagram, nó chứa datagram trong bộ đệm buff[]và chiều dài gói dữ liệu làlen, bắt đầu từ vị trí offset

  10. Khởi tạo datagram để gửi • public DatagramPacket(byte[] b, int length, InetAddress host, int port) • public DatagramPacket(byte[] b, int length, SocketAddress host, int port) • Host: host ở xa xác định bởi InetAddress hoặc SocketAddress • Port: số hiệu port của host • Length: Chiều dài byte của datagram • Offset: vị trí bắt đầu int offset

  11. Nhận các thông tin từ DatagramPacket • public InetAddress getAddress() trả về một đối tượng InetAddress chứa địa chỉ IP của host ở xa. • public int getPort() trả về số cổng củahost mà đã gửi datagram đi • public SocketAddress() trả về một đối tượng SocketAddress chứa địa chỉ IP và số hiệu cổng của host ở xa. • public byte[] getData() trả về một mảng byte chứa dữ liệu từ datagram

  12. Nhận các thông tin từ DatagramPacket • public int getLength() trả về số bytes dữ liệu có trong một datagram. • public getOffset()trả về vị trí trong mảng được trả về bởi phương thức getData() • public String(byte[] buffer,String encoding) chuyển đổi mảng byte thành một đối tượng String có cách thức mã hóa encoding ex, dp được nhận từ mạng, chuyển thành xâu ký tự : String s=new String(dp.getData(),”ASCII”); • public ByteArrayInputStream(byte[] b, int offset, int length) chuyển đổi mảng byte (sử dụng như là một luồng nhập InputStream) được trả về bởi phương thức getData() thành luồng ByteArrayInputStream

  13. thay đổi thông tin của datagram • public void setAddress(InetAddress dc) thay đổi địa chỉ của máy mà ta sẽ gửi gói tin tới. • public void setPort(int port) thay đổi số hiệu cổng gửi tới của gói tin. • public void setLength(int length) thay đổi số byte dữ liệu có thể đặt trong vùng đệm. • public void setData(byte[] b): thay đổi dữ liệu của datagram • public void setData(byte[] b, int offset, int length) để gửi một khối lượng dữ liệu lớn. Thay vì gửi toàn bộ dữ liệu trong mảng, ta có thể gửi dữ liệu trong từng đoạn của mảng tại mỗi thời điểm.

  14. DatagramSocket class • DatagramSocket class: Dùng để gửi /nhận đi 1 gói dữ liệu DatagramPacket theo UDP public class DatagramSocket extends Object • Tất cả các datagram được gắn với một cổng cục bộ - được sử dụng để lắng nghe các datagram đến hoặc được đặt trên các header của các datagram sẽ gửi đi. • Cung cấp các phương thức: • để gửi và nhận các gói tin, • cũng như xác định một giá trị timeout khi sử dụng phương pháp vào ra không phong tỏa (non blocking I/O), • kiểm tra và sửa đổi kích thước tối đa của gói tin UDP, • đóng socket.

  15. Khởi tạo DatagramSocket • Constructors: • Public DatagramSocket() throw SocketException Khởi tạo một socket UDP và chấp nhận nó trên port còn trống của local host • Public DatagramSocket(int port) throw SocketException Khởi tạo một socket UDP và chấp nhận nó trên port xác định của local host • public DatagramSocket(int port, InetAddress laddr) throws SocketException Khởi tạo một socket UDP với đ/c cục bộ và port xác định

  16. DatagramSocket class: Methods • void connect(InetAddress address, int port): kết nối socket đến đ/c từ xa. • void receive(DatagramPacket dp) throws IOException: nhận 1 gói tin UDP và lưu nộidung trong packet xác định. • void send(DatagramSocket dp) throws IOException: gửi một gói tin

  17. DatagramSocket class: Methods • InetAddress getInetAddress(): trả về địa chỉ remote mà socket kết nối tới, hoặc giá trị null nếu không tồn tại liên kết. • InetAddress getLocalAddress(): trả về địa chỉ cục bộ • Int getSoTimeOut() trả về giá trị timeout của socket. • void setSoTimeOut(int timeout): thiết lậptimeout • void close(): đóng một liên kết và g.phóng nó khỏi cổng cục bộ. • void disconnect(): ngắt kết nối socket

  18. Quá trình gửi gói tin UDP

  19. Ex, Quá trình gửi gói tin UDP import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; publicclassSending { publicstaticvoid main(String[] argv) throws Exception { InetAddress dst = InetAddress.getLocalHost(); int port = 8080; byte[] outbuf = newbyte[1024]; int len = 1024; DatagramPacket request = new DatagramPacket(outbuf, len, dst, port); DatagramSocket socket = new DatagramSocket(); socket.send(request); } }

  20. Quá trình nhận gói tin UDP

  21. Ex, Quá trình nhận gói tin UDP simport java.net.DatagramPacket; import java.net.DatagramSocket; publicclassReceving { publicstaticvoid main(String[] argv) throws Exception { byte[] inbuf = newbyte[256]; // default size DatagramSocket socket = new DatagramSocket(); DatagramPacket packet = new DatagramPacket(inbuf, inbuf.length); socket.receive(packet); int numBytesReceived = packet.getLength(); System.out.println(numBytesReceived); } }

  22. Ứng dụng xử lý gói tin nhận được • Data là text DataInputStream BufferedReader

  23. Tương tác client/server qua UDP socket

  24. Cấu trúc chuơng trình client

  25. Cấu trúc chuơng trình server

  26. Ex: viết ứng dụng client/ server bằng UDP Socket 1) client đọc các dòng văn bản do người dùng gõ từ bàn phím, gửi tới server qua socket 2) server đọc các dòng gửi từ socket 3) server chuyển sang chữ hoa và gửi trả lại choclient 4) client đọc và in lại dòng văn bản nhận được từ socket

  27. UDP client class UDPClient2 { publicstaticvoid main(String args[]) throws Exception { // Create InputStream from keyboard BufferedReader inStr = new BufferedReader(new InputStreamReader(System.in)); String str = inStr.readLine(); // Create client socket, connect to server DatagramSocket clientSk = new DatagramSocket(); //Translate hostname to IP InetAddress IPAddress = InetAddress.getByName("localhost"); // Define data to send and receive byte[] seData = newbyte[1024]; byte[] reData = newbyte[1024]; seData = str.getBytes();

  28. UDP Client // Create datagram with data to send from this socket to server DatagramPacket sePacket = new DatagramPacket(seData, seData.length, IPAddress, 9876); //sending clientSk.send(sePacket); // Create datagram for receive from server DatagramPacket rePacket = new DatagramPacket(reData, reData.length); //receiving data from socket clientSk.receive(rePacket); //get data in String String modiStr = new String(rePacket.getData()); System.out.println("FROM SERVER:" + modiStr); clientSk.close(); } }

  29. UDP Server classUDPServer2 { publicstaticvoid main(String args[]) throws Exception { //Create socket at 9876 DatagramSocket serverSk = new DatagramSocket(9876); //Define data to send and receive byte[] reData = newbyte[1024]; byte[] seData = newbyte[1024]; System.out.println("Waiting request from client..."); while(true) { // Create space datagram for receive from client DatagramPacket rePacket = newDatagramPacket(reData, reData.length); //receiving serverSk.receive(rePacket); // get data in String String sentence = newString(rePacket.getData());

  30. UDP Server // get infor Ip, port of client InetAddress IPAddress = rePacket.getAddress(); int port = rePacket.getPort(); //process String capSentence = sentence.toUpperCase(); seData = capSentence.getBytes(); //Create datagram with data to send from this socket to DatagramPacket sePacket = newDatagramPacket(seData, seData.length, IPAddress, port); //sending serverSk.send(sePacket); System.out.println("Done!!!!"); } } }

  31. output

  32. Ex, Using GUI in UDP Socket • Cắt 5 ký tự đầu của chuỗi:

  33. MultiThread trong các chương trình Server Đa tuyến hay được ứng dụng trong các chương trình Server: • Tạo socket và đăng ký với hệ thống • Lặp công việc nhận dữ liệu từ client, đối với một dữ liệu nhận: • tạo mới một process để xử lý. • Tiếp tục nhận dữ liệu mới từ client • Công việc của process mới: • Nhận thông tin của process cha chuyển đến, lấy thông tin socket • Xử lý và gửi thông tin về cho client theo giao thức lớp ứng dụng đã thiết kế • Kết thúc

  34. Ex, MultiThread in Server UDP Socket • Thread_UDPServer • UDPServer extends Thread • Thread_UDPClient • SeThread extends Thread • ReThread extends Thread

  35. TCP/UDP Header

More Related