Lập trình mạng - Chương 3: Mô hình client - Server và lập trình socket

Mô tả ứng dụng :  Client thực hiện các thao tác sau đây:  Client gửi một xâu ký tựdo người dùng nhập từbàn phím cho server  Client nhận thông tin phản hồi trởlại từServer và hiển thịthông tin đó trên màn hình  Server thực hiện các thao tác sau:  Server nhận xâu ký tựdo client gửi tới và in lên màn hình  Server biến đổi xâu ký tựthành chữhoa và gửi trởlại cho Client

pdf58 trang | Chia sẻ: nguyenlam99 | Lượt xem: 1285 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Lập trình mạng - Chương 3: Mô hình client - Server và lập trình socket, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Chương 3: Mô Hình Client-Server & Lập Trình Socket GIẢNG VIÊN : THS . NGUYỄN MINH THÀNH EMAIL : THANHNM@ITC.EDU.VN Nội Dung 1. Mô hình client – server 2. Mô hình truyền tin socket 3. Lập trình socket hướng kết nối 4. Lập trình socket phi kết nối MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 2 Mô Hình Client/Server  Gồm có một chương trình đóng vai trò là client và một chương trình đóng vai trò là server. Hai chương trình này sẽ giao tiếp với nhau thông qua mạng. Chương trình server đóng vai trò cung cấp dịch vụ. Chương trình này luôn luôn lắng nghe các yêu cầu từ phía client, rồi tính toán và đáp trả kết quả tương ứng. Chương trình client cần một dịch vụ và gởi yêu cầu dịch vụ tới chương trình server và đợi đáp trả từ server. MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 1. Mô Hình Client/Server 3 Mô Hình Client/Server (tt) Quá trình trao đổi dữ liệu giữa Client và Server  Truyền một yêu cầu từchương trình client tới chương trình server  Yêu cầu được server xửlý  Truyền đáp ứng cho client MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 1. Mô Hình Client/Server 4 Các Kiến Trúc Client/Server Client/Server hai tầng  Tầng ứng dụng (client)  Tầng lưu trữ dữ liệu (server) Đặc điểm kiến trúc 2 tầng  công việc xử lý được dành cho phía client  server chỉ đóng vai trò kiểm soát luồng vào ra giữa ứng dụng và dữ liệu Nhược điểm  Toàn bộ ứng dụng được xử lý trên client  Không tận dụng được hết khả năng của server  Truyền tải dữ liệu giữa client và server nhiều MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 1. Mô Hình Client/Server 5 Các Kiến Trúc Client/Server Client/Server 3 tầng  Tầng trình diễn (client)  Tầng lưu trữ dữ liệu (data server)  Tầng xử lý dữ liệu trung tâm (Application server) MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 1. Mô Hình Client/Server 6 Lập Trình Mạng với Socket  Trong mô hình TCP/IP, các chương trình client và server thường sử dụng các giao thức ở tầng ứng dụng và tầng vận chuyển để truyền thông dữ liệu cho nhau. Các giao thức còn lại chủ yếu nằm ở phần cứng mạng như card mạng, switch,.  2 giao thức chính được dùng trong lập trình Socket là : TCP và UDP MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 2. Lập Trình Mạng với Socket 7 Khái niệm về Socket  Socket  Đối tượng nằm giữa chương trình với 2 giao thức vận chuyển TCP và UDP. ◦ Một giao diện lập trình mạng để giao tiếp với các giao thức TCP và UDP. ◦ Lập trình viên không sử dụng trực tiếp giao thức TCP và UDP MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 2. Lập Trình Mạng với Socket 8 Khái niệm về Socket (tt)  Có 3 loại socket  Socket hướng kết nối (TCP Socket)  Socket không hướng kết nối (UDP Socket)  Raw socket MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 2. Lập Trình Mạng với Socket 9 Lý do sử dụng Socket Tại sao lập trình viên không sử dụng trực tiếp giao thức TCP và UDP để truyền tin ?  Dữ liệu được truyền trên mạng Internet dưới dạng các gói có kích thước hữu hạn được gọi là datagram.  Mỗi datagram chứa một header và một payload. Header chứa địa chỉ và cổng cần truyền gói tin đến, cũng như địa chỉ và cổng xuất phát của gói tin, và các thông tin khác được sử dụng để đảm bảo độ tin cậy truyền tin, payload chứa dữ liệu.  Tuy nhiên do các datagram có chiều dài hữu hạn nên thường phải phân chia dữliệu thành nhiều gói và khôi phục lại dữliệu ban đầu từcác gói ởnơi nhận.  Trong quá trình truyền tin có thểcó một hay nhiều gói bịmất hay bịhỏng và cần phải truyền lại hoặc các gói tin đến không theo đúng trình tự.  việc phân chia dữliệu thành các gói, tạo các header, phân tích header của các gói đến, quản lý danh sách các gói đã nhận được và các gói chưa nhận được, ... rất nhiều công việc cần phải thực hiện, và đòi hỏi rất nhiều phần mềm phức tạp. MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 2. Lập Trình Mạng với Socket 10 Lý do sử dụng Socket (tt) Các Socket che dấu người lập trình khỏi các chi tiết mức thấp của mạng như kiểu đường truyền, các kích thước gói, yêu cầu truyền lại gói, các địa chỉ mạng... Chúng cho phép người lập trình xem một liên kết mạng nhưlà một luồng mà có thể đọc dữ liệu ra hay ghi dữliệu vào từ luồng này. MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 2. Lập Trình Mạng với Socket 11 Các Thao Tác cơ bản trên Socket Kết nối với một máy ở xa Gửi dữ liệu Nhận dữ liệu Ngắt liên kết Gán cổng Nghe dữ liệu đến Chấp nhận liên kết từ các máy ở xa trên cổng đã được gán MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 2. Lập Trình Mạng với Socket 12 Socket hướng kết nối (TCP socket)  Lập trình socket hướng kết nối sử dụng giao thức TCP để thành lập phiên làm việc giữa client và server.  Cần thực hiện đàm phán kết nối trước khi thực hiện truyền dữ liệu.  Việc thực hiện truyền dữ liệu có sự tin tưởng tuyệt đối. MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 3. Lập Trình Socket hướng kết nối 13 Đặc Điểm của TCP Socket Có một đường kết nối ảo giữa 2 tiến trình Một trong 2 tiến trình phải đợi tiến trình kia yêu cầu kết nối Có thể sử dụng liên lạc theo mô hình client/server Trong mô hình Client/Server thì Server lắng nghe và chấp nhận một yêu cầu kết nối Mỗi thông điệp gửi đều có xác nhận trở về Các gói tin chuyển đi tuần tự Độ tin cậy truyền tin cao nhưng tốc độ bị hạn chế MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 3. Lập Trình Socket hướng kết nối 14 Mô Hình Truyền Thông của TCP Socket  Các thao tác thực thiện trong kết nối TCP Socket MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 3. Lập Trình Socket hướng kết nối 15 Thiết kế giải thuật cho Server  Sử dụng đối tượng ServerSocket Các bước thực hiện của một ServerSocket  Bước 1 : Tạo một đối tượng ServerSocket  Bước 2: Tạo một đối tượng Socket bằng cách chấp nhận liên kết từ yêu cầu liên kết của client. Sau khi chấp nhận liên kết, phương thức accept() trả về đối tượng Socket thể hiện liên kết giữa Client và Server.  Bước 3: Tạo một luồng nhập để đọc dữ liệu từ client  Bước 4: Tạo một luồng xuất để gửi dữ liệu trở lại cho server  Bước 5: Thực hiện các thao tác vào ra với các luồng nhập và luồng xuất  Bước 6: Đóng socket s khi đã truyền tin xong. Việc đóng socket cũng đồng nghĩa với việc đóng các luồng. MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 3. Lập Trình Socket hướng kết nối 16 Lập Trình TCP Socket phía Server Phương thức khởi tại ServerSocket  public ServerSocket(int port) throws IOException, BindException  Constructor này tạo một socket cho server trên cổng xác định. Nếu port bằng 0, hệ thống chọn một cổng ngẫu nhiên cho ta. Cổng do hệ thống chọn đôi khi được gọi là cổng vô danh vì ta không biết số hiệu cổng. Với các server, các cổng vô danh không hữu ích lắm vì các client cần phải biết trước cổng nào mà nó nối tới  Ví dụ : để khởi tạo Server lắng nghe cổng 80 MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 3. Lập Trình Socket hướng kết nối try{ ServerSocket server = new ServerSocket(80); } catch(IOException e) { System.err.println(e); } 18 Lập Trình TCP Socket phía Server Phương thức khởi tại ServerSocket  public ServerSocket(int port, int queuelength, InetAddress bindAddress)throws IOException  Constructor này tạo một đối tượng ServerSocket trên cổng xác định với chiều dài hàng đợi xác định. ServerSocket chỉ gán cho địa chỉ IP cục bộ xác định.  Constructor này hữu ích cho các server chạy trên các hệ thống có nhiều địa chỉ IP. MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 3. Lập Trình Socket hướng kết nối 19 Lập Trình TCP Socket phía Server Chấp nhận và ngắt liên kết  public Socket accept() throws IOException  Khi bước thiết lập liên kết hoàn thành, và ta sẵn sàng để chấp nhận liên kết, cần gọi phương thức accept() của lớp ServerSocket.  Phương thức này phong tỏa; nó dừng quá trình xử lý và đợi cho tới khi client được kết nối.  Khi client thực sự kết nối, phương thức accept() trả về đối tượng Socket.  Sau khi kết nối, ta sử dụng các phương thức getInputStream() và getOutputStream() để truyền tin với client. MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 3. Lập Trình Socket hướng kết nối 20 Lập Trình TCP Socket phía Server Chấp nhận và ngắt liên kết (tt)  Ví dụ MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 3. Lập Trình Socket hướng kết nối try{ ServerSocket theServer = new ServerSocket(5776); while(true) { Socket con = theServer.accept(); PrintStream p = new PrintStream(con.getOutputStream()); p.println(“Ban da ket noi toi server nay. Bye-bye now.”); con.close(); } } catch(){} 21 Lập Trình TCP Socket phía Server Chấp nhận và ngắt liên kết (tt)  public void close() throws IOException  Nếu ta đã kết thúc làm việc với một đối tượng server socket thì cần phải đóng lại đối tượng này, giải phóng tài nguyên cho ứng dụng khác. Phương thức cho biết địa chỉ cục bộ và cổng của Server  public InetAddress getInetAddress()  public int getLocalHost() MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 3. Lập Trình Socket hướng kết nối 22 Lập Trình TCP Socket phía Server Một ví dụ về socket Server : lớp daytimeServer MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 3. Lập Trình Socket hướng kết nối import java.net.*; import java.io.*; import java.util.Date; public class daytimeServer{ public final static int daytimePort =13; public static void main(String[] args) { ServerSocket theServer; Socket con; PrintStream p; try{ theServer = new ServerSocket(daytimePort); try{ p= new PrintStream(con.getOutputStream()); p.println(new Date()); con.close(); } 23 Lập Trình TCP Socket phía Server Một ví dụ về socket Server : lớp daytimeServer MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 3. Lập Trình Socket hướng kết nối catch(IOException e) { theServer.close(); System. err.println(e); } } catch(IOException e) { System. err.println(e); } } } 24 Thiết kế giải thuật cho Client Sử dụng lớp đối tượng Socket Các bước thực hiện của Socket  Bước 1:Tạo một đối tượng Socket  Bước 2: Tạo một luồng xuất để có thể sử dụng để gửi thông tin tới Socket  Bước 3:Tạo một luồng nhập để đọc thông tin đáp ứng từ server  Bước 4:Thực hiện các thao tác vào/ra với các luồng nhập và luồng xuất  Bước 5: Đóng socket khi hoàn thành quá trình truyền tin MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 3. Lập Trình Socket hướng kết nối 25 Lập Trình TCP Socket phía Client Phương thức khởi tạo  public Socket(String host, int port) throws UnknownHostException, IOException : tạo một socket TCP với host và cổng xác định, và thực hiện liên kết với host ở xa. Tham số host là hostname kiểu String.  public Socket(InetAddress host, int port)throws IOException : tạo một socket TCP với thông tin là địa chỉ của một host được xác định bởi một đối tượng InetAddres và số hiệu cổng port, sau đó nó thực hiện kết nối tới host. MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 3. Lập Trình Socket hướng kết nối 26 Lập Trình TCP Socket phía Client Phương thức khởi tạo  public Socket (String host, int port, InetAddress interface, int localPort) throws IOException, UnknownHostException : Socket kết nối tới host ở xa thông qua một giao tiếp mạng và số hiệu cổng cục bộ được xác định bởi hai tham số sau.  public Socket (InetAddress host, int port, InetAddress interface, int localPort) throws IOException, UnknownHostException MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 3. Lập Trình Socket hướng kết nối 27 Lập Trình TCP Socket phía Client Phương thức nhận thông tin từ Socket  public InetAddress getInetAddress() : cho biết host ở xa mà Socket kết nối tới  public int getPort() : cho biết số hiệu cổng mà Socket kết nối tới trên host ở xa  public int getLocalPort() : cho biết số hiệu cổng ở phía host cục bộ  InetAddress getLocalAddress() : cho biết giao tiếp mạng được sử dụng cho socket  public InputStream getInputStream() throws IOException : trả về một luồng nhập để đọc dữ liệu từ một socket vào chương trình  public OutputStream getOutputStream() throws IOException : trả về một luồng xuất thô để ghi dữ liệu từ ứng dụng ra đầu cuối của một socket. MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 3. Lập Trình Socket hướng kết nối 28 Lập Trình TCP Socket phía Client Phương thức đóng Socket  public void close() throws IOException : Phương thức close() đóng cả các luồng nhập và luồng xuất từ socket  public void shutdownInput() throws IOException : đóng luồng nhập  public void shutdownOutput() throws IOException : đóng luồng xuất  public boolean isInputShutdown() : kiểm tra luồng nhập đã đóng  public boolean isOutputShutdown() : kiểm tra luồng xuất đã đóng MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 3. Lập Trình Socket hướng kết nối 29 Lập Trình TCP Socket phía Client Phương thức thiết lập tùy chọn cho Socket  TCP_NODELAY : (TRUE) đảm bảo rằng các gói tin được gửi đi nhanh nhất có thể mà không quan tâm đến kích thước của chúng  public void setTcpNoDelay(boolean on) throws SocketException  public boolean getTcpNoDelay() throws SocketException  SO_LINGER : xác định phải thực hiện công việc gì với datagram vẫn chưa được gửi đi khi một socket đã bị đóng lại (0 – hủy)  public void setSoLinger(boolean on, int seconds) throws SocketException  public int getSoLinger() throws SocketException  SO_TIMEOUT : xác thời gian phong tỏa khi đọc dữ liệu từ socket  public void setSoTimeout(int milliseconds) throws SocketException  public int getSoTimeout() throws SocketException MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 3. Lập Trình Socket hướng kết nối 30 Ví dụ : Xây dựng ứng dụng Client/Server Mô tả ứng dụng :  Client thực hiện các thao tác sau đây:  Client gửi một xâu ký tựdo người dùng nhập từbàn phím cho server  Client nhận thông tin phản hồi trởlại từServer và hiển thịthông tin đó trên màn hình  Server thực hiện các thao tác sau:  Server nhận xâu ký tựdo client gửi tới và in lên màn hình  Server biến đổi xâu ký tựthành chữhoa và gửi trởlại cho Client MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 3. Lập Trình Socket hướng kết nối 31 Ví dụ : Ứng dụng phía Server MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 3. Lập Trình Socket hướng kết nối public class EchoServer { public final static int DEFAULT_PORT=2007; public static void main(String[] args) { int port=DEFAULT_PORT; try{ServerSocket ss = new ServerSocket(port); Socket s=null; while(true) { try{ s=ss.accept(); PrintWriter pw=new PrintWriter(new OutputStreamWriter(s.getOutputStream())); BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream())); 32 Một ví dụ khác về socket Server : lớp EchoServer (tt) MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 3. Lập Trình Socket hướng kết nối while(true){ String line=br.readLine(); if(line.equals("exit"))break; String upper=line.toUpperCase(); pw.println(upper); pw.flush(); } //end while }// end try catch(IOException e) { } finally{ try{ if(s!=null) s.close(); } catch(IOException e){} }//end finally } } catch(IOException e) { } } } 33 Ví dụ : Ứng dụng phía Client MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 3. Lập Trình Socket hướng kết nối public class EchoClient { public static void main(String[] args) { String hostname="localhost"; if(args.length>0) { hostname=args[0]; } PrintWriter pw=null; BufferedReader br=null; try{ Socket s=new Socket(hostname,2007); br=newBufferedReader(new InputStreamReader(s.getInputStream())); BufferedReader user; user=new BufferedReader(new InputStreamReader(System.in)); pw=new PrintWriter(s.getOutputStream()); 34 Ví dụ : Ứng dụng phía Client MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 3. Lập Trình Socket hướng kết nối System.out.println("Da ket noi duoc voi server..."); while(true) { String st=user.readLine(); if(st.equals("exit")) { break; } pw.println(st); pw.flush(); System.out.println(br.readLine()); } // end while } //end try catch(IOException e) { System.err.println(e); } 35 Ví dụ : Ứng dụng phía Client MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 3. Lập Trình Socket hướng kết nối finally{ try{ if(br!=null) br.close(); if(pw!=null)pw.close(); } catch(IOException e) { System.err.println(e); } } } } 36 Bài tập  Viết lại ứng dụng Echo bằng ứng dụng đa tuyến MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 3. Lập Trình Socket hướng kết nối 37 Socket phi kết nối (UDP socket)  Lập trình socket phi kết nối sử dụng giao thức UDP để truyền tin giữa client và server.  Không cần thực hiện đàm phán kết nối trước khi thực hiện truyền dữ liệu  Việc truyền dữ liệu không có sự tin cậy. MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 4. Lập trình Socket phi kết nối 38 Đặc Điểm của UDP Socket Hai tiến trình không liên lạc trực tiếp với nhau Thông điệp gửi đi phải kèm theo địa chỉ người nhận Thông điệp có thể gửi nhiều lần Người gửi không chắc chắn thông điệp đến tay người nhận Thông điệp gửi sau có thể đến trước thông điệp trước đó Không có sự tin cậy trong truyền tin nhưng tốc độ nhanh MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 4. Lập trình Socket phi kết nối 39 Mô Hình Truyền Thông của UDP Socket  Các thao tác thực hiện trong kết nối UDP Socket MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 4. Lập trình Socket phi kết nối 40 Lập Trình UDP Socket Trong lập trình Socket phi kết nối, cả Server và client đều sử dụng 2 lớp đối tượng sau :  DatagramSocket : thực hiện đồng thời cả 2 nhiệm vụ gửi và nhận dữ liệu.  DatagramPacket : thể hiện gói dữ liệu cần gửi, lớp này đóng gói các byte dữ liệu và thông tin về đối tượng nhận. MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 4. Lập trình Socket phi kết nối 41 Lập Trình UDP Socket (tt) Lớp DatagramPacket  Phương thức khởi tạo mới để nhận dữ liệu từ mạng public DatagramPacket(byte[] b, int length) public DatagramPacket(byte[] b, int offset, int length)  Phương thức khởi tạo mới để gửi dữ liệu public DatagramPacket(byte[] b, int length, InetAddress dc, int port) public DatagramPacket(byte[] b, int offset, int length, InetAddress dc, int port) public DatagramPacket(byte[] b, int length, SocketAddress dc, int port) public DatagramPacket(byte[] b, int offset, int length, SocketAddress dc, int port) MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 4. Lập trình Socket phi kết nối 42 Lập Trình UDP Socket (tt) Lớp DatagramPacket  Phương thức nhận thông tin của host ở xa public InetAddress getAddress() public int getPort() public SocketAddress getSocketAddress()  Phương thức nhận dữ liệu gửi đến public byte[] getData() public int getLength() public getOffset() MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 4. Lập trình Socket phi kết nối 43 Lập Trình UDP Socket (tt) Lớp DatagramPacket  Phương thức thay đổi thông tin public void setData(byte[] b) public void setData(byte[] b, int offset, int length) public void setAddress(InetAddress dc) public void setPort(int port) pubic void setAddress(SocketAddress sa) public void setLength(int length) MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 4. Lập trình Socket phi kết nối 44 Lập Trình UDP Socket (tt) Lớp DatagramSocket  Phương thức khởi tạo public DatagramSocket() public DatagramSocket(int port) cổng trên máy cục bộ public DatagramSocket(int port, InetAddress laddr) : địa chỉ mạng của máy cục bộ Các phương thức khác public bind(SocketAddress addr) : rang buộc tới 1 địa chỉ và cổng cục bộ public connect(InetAddress address, int port) : kết nối đến một địa chỉ ở xa public DatagramSocket(int port, InetAddress laddr) : địa chỉ mạng của máy cục bộ MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 4. Lập trình Socket phi kết nối 45 Lập Trình UDP Socket (tt) Lớp DatagramSocket Các phương thức khác public void close() : đóng kết nối, giải phóng cổng cục bộ public InetAddress getLocalAddress() : trả về địa chỉ cục bộ public InetAddress getInetAddress() : trả về địa chỉ từ xa mà socket kết nối tới public Int getSoTimeOut() : trả về giá trị tùy chọn timeout của socket public void receive(DatagramPacket dp) throws IOException : phương thức đọc một gói tin UDP và lưu nội dung trong packet xác định. public void send(DatagramSocket dp) throws IOException:phương thức gửi một gói tin public void setSoTimeOut(int timeout): thiết lập giá trịtùy chọn của socket. MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 4. Lập trình Socket phi kết nối 46 Gửi & Nhận Gói Tin UDP MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 4. Lập trình Socket phi kết nối 47 Gửi & Nhận Gói Tin UDP (tt) MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 4. Lập trình Socket phi kết nối 48 Gửi chuỗi ký tự : DatagramSocket socket = new DatagramSocket(2000); String s=”This is an example of UDP Programming”; byte[] b= s.getBytes(); InetAddress dc=InetAddress.getByName(“www.vnn.vn”); int port =7; DatagramPacket dp=new DatagramPacket(b,b.length,dc,port); Socket.send(dp); Nhận chuỗi ký tự : DatagramSocket socket = new DatagramSocket(2000); DatagramPacket dp=new DatagramPacket(new byte[256],256); ds.receive(dp); String s=new String(dp.getData(),”ASCII”); Gửi & Nhận Gói Tin UDP (tt) MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 4. Lập trình Socket phi kết nối 49 Nhận dữ liệu bất kỳ: sử dụng các luồng Input (InputStream, InputStreamReader, DataInputStream) ByteArrayInputStream bis=new ByteArrayInputStream(dp.getData()); DataInputStream dis=new DataInputStream(bis); Thiết kế giải thuật cho Server Bước 1 : Tạo một đối tượng DatagramSocket với một port cần lắng nghe Bước 2: Tạo một gói dữ liệu DatagramPacket để nhận dữ liệu sẽ được gửi từ 1 client nào đó Bước 3: Thực hiện chờ để nhận dữ liệu từ client gửi đến Bước 4: Tạo luồng nhập và nhận dữ liệu từ gói DatagramPacket Bước 5: Tạo dữ liệu muốn gửi về client và thông tin của client từ gói dữ liệu đã nhận. Bước 6: Gửi dữ liệu về client và tiếp tục nhận dữ liệu mới từ client khác MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 4. Lập trình Socket phi kết nối 50 Thiết kế giải thuật cho Client Bước 1 : Tạo một đối tượng DatagramSocket với một port cần lắng nghe Bước 2: Tạo một gói dữ liệu DatagramPacket và dữ liệu cần gửi Bước 3: Thực hiện gửi dữ liệu Bước 4: Kiểm tra có dữ liệu được trả về Bước 5: Tiếp tục gửi dữ liệu tiếp theo MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 4. Lập trình Socket phi kết nối 51 Ví dụ : Xây dựng ứng dụng Client/Server như chương 3 Mô tả ứng dụng :  Client thực hiện các thao tác sau đây:  Client gửi một xâu ký tựdo người dùng nhập từbàn phím cho server  Client nhận thông tin phản hồi trởlại từServer và hiển thịthông tin đó trên màn hình  Server thực hiện các thao tác sau:  Server nhận xâu ký tựdo client gửi tới và in lên màn hình  Server biến đổi xâu ký tựthành chữhoa và gửi trởlại cho Client MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 4. Lập trình Socket phi kết nối 52 Ví dụ : Ứng dụng phía Server MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 3. Lập Trình Socket hướng kết nối public class UDPEchoServer { public final static int CONG_MAC_DINH=2000; public static void main(String args[]) { int serverPort=CONG_MAC_DINH; try{ serverPort =Integer.parseInt(args[1]); } catch(Exception e){ } try{ DatagramSocket ds =new DatagramSocket(serverPort); DatagramPacket dp=new DatagramPacket(new byte[1024],1024); while(true){ ds.receive(dp); 53 Ví dụ : Ứng dụng phía Server MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 3. Lập Trình Socket hướng kết nối ByteArrayInputStream bis = new ByteArrayInputStream(dp.getData()); BufferedReader dis; dis =new BufferedReader(new InputStreamReader(bis)); String s=dis.readLine(); System.out.println(s); s = s.toUpperCase(); dp.setData(s.getBytes()); dp.setLength(s.length()); dp.setAddress(dp.getAddress()); dp.setPort(dp.getPort()); ds.send(dp); } } 54 Ví dụ : Ứng dụng phía Server MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 3. Lập Trình Socket hướng kết nối catch(UnknownHostException e) { System.err.println(e); } catch(IOException e) { System.err.println(e); } } } 55 Ví dụ : Ứng dụng phía Client MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 3. Lập Trình Socket hướng kết nối public class UDPEchoClient { public final static int CONG_MAC_DINH=1000; public static void main(String args[]) { String hostname; int clientPort=CONG_MAC_DINH; if(args.length>0) { hostname=args[0]; try{ clientPort =Integer.parseInt(args[1]); } catch(Exception e){} } else { hostname="localhost"; //server host } try{ InetAddress dc=InetAddress.getByName(hostname); 56 Ví dụ : Ứng dụng phía Client MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 3. Lập Trình Socket hướng kết nối BufferedReader userInput=new BufferedReader(new InputStreamReader(System.in)); DatagramSocket ds =new DatagramSocket(clientPort); while(true){ byte[] sendData = new byte[1024]; byte[] receiveData = new byte[1024]; String line=userInput.readLine(); if(line.equals("exit")) break; sendData=line.getBytes(); DatagramPacket sendPacket=new DatagramPacket(sendData,sendData.length,dc,2000); ds.send(sendPacket); DatagramPacket receivePacket=new DatagramPacket(receiveData,receiveData.length); ds.receive(receivePacket); 57 Ví dụ : Ứng dụng phía Client MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET 3. Lập Trình Socket hướng kết nối ByteArrayInputStream bis =new ByteArrayInputStream(receivePacket.getData()); BufferedReader dis =new BufferedReader(new InputStreamReader(bis)); System.out.println(dis.readLine()); } } catch(UnknownHostException e) { System.err.println(e); } catch(IOException e) { System.err.println(e); } } } 58 Hết Chương 3

Các file đính kèm theo tài liệu này:

  • pdflec_3_lap_trinh_socket_619.pdf