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
1. Mô Hình Client/Server
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
3
1. Mô Hình Client/Server
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ý
MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET
4
Truyền đáp ứng cho client
1. Mô Hình Client/Server
Các Kiến Trúc Client/Server
Client/Server hai tầng Tầng ứng dụng (client)
Đặc điểm kiến trúc 2 tầng
Tầng lưu trữ dữ liệu (server)
server chỉ đóng vai trò kiểm soát luồng
công việc xử lý được dành cho phía client
Nhược điểm
vào ra giữa ứng dụng và dữ liệu
Không tận dụng được hết khả năng của server
Toàn bộ ứng dụng được xử lý trên client
MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET
5
Truyền tải dữ liệu giữa client và server nhiều
1. Mô Hình Client/Server
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)
MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET
6
Tầng xử lý dữ liệu trung tâm (Application server)
2. Lập Trình Mạng với Socket
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
7
2. Lập Trình Mạng với Socket
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
8
2. Lập Trình Mạng với Socket
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)
MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET
9
Raw socket
2. Lập Trình Mạng với Socket
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
10
2. Lập Trình Mạng với Socket
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
11
2. Lập Trình Mạng với Socket
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
12
3. Lập Trình Socket hướng kết nối
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
13
3. Lập Trình Socket hướng kết nối
Đặ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
14
3. Lập Trình Socket hướng kết nối
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
15
3. Lập Trình Socket hướng kết nối
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 6: Đóng socket s khi đã truyền tin xong. Việc đóng socket cũng đồng nghĩa
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
MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET
16
với việc đóng các luồng.
3. Lập Trình Socket hướng kết nối
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
try{
} catch(IOException e) {
ServerSocket server = new ServerSocket(80);
System.err.println(e);
MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET
18
}
3. Lập Trình Socket hướng kết nối
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
19
3. Lập Trình Socket hướng kết nối
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
20
3. Lập Trình Socket hướng kết nối
Lập Trình TCP Socket phía Server Chấp nhận và ngắt liên kết (tt)
Ví dụ
try{
ServerSocket theServer = new ServerSocket(5776); while(true) {
Socket con = theServer.accept(); PrintStream p = new
now.”);
PrintStream(con.getOutputStream()); p.println(“Ban da ket noi toi server nay. Bye-bye
con.close();
}
MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET
21
} catch(…){…}
3. Lập Trình Socket hướng kết nối
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
22
3. Lập Trình Socket hướng kết nối
Lập Trình TCP Socket phía Server Một ví dụ về socket Server : lớp daytimeServer
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();
MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET
23
}
3. Lập Trình Socket hướng kết nối
Lập Trình TCP Socket phía Server Một ví dụ về socket Server : lớp daytimeServer
}
catch(IOException e) { theServer.close(); System. err.println(e);
} catch(IOException e) {
System. err.println(e);
}
}
MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET
24
}
3. Lập Trình Socket hướng kết nối
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
25
3. Lập Trình Socket hướng kết nối
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
26
3. Lập Trình Socket hướng kết nối
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
27
3. Lập Trình Socket hướng kết nối
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
28
3. Lập Trình Socket hướng kết nối
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
29
3. Lập Trình Socket hướng kết nối
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
30
3. Lập Trình Socket hướng kết nối
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
31
3. Lập Trình Socket hướng kết nối
Ví dụ : Ứng dụng phía Server
public final static int DEFAULT_PORT=2007; public static void main(String[] args) { int port=DEFAULT_PORT;
public class EchoServer {
try{ServerSocket ss = new ServerSocket(port);
Socket s=null; while(true) {
try{ s=ss.accept();
PrintWriter pw=new PrintWriter(new
BufferedReader(new
OutputStreamWriter(s.getOutputStream())); BufferedReader br=new
MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET
32
InputStreamReader(s.getInputStream()));
3. Lập Trình Socket hướng kết nối
Một ví dụ khác về socket Server : lớp EchoServer (tt)
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) { }
}
MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET
33
}
3. Lập Trình Socket hướng kết nối
Ví dụ : Ứng dụng phía Client
public class EchoClient {
String hostname="localhost"; if(args.length>0) { hostname=args[0];
public static void main(String[] args) {
} 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));
MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET
34
pw=new PrintWriter(s.getOutputStream());
3. Lập Trình Socket hướng kết nối
Ví dụ : Ứng dụng phía Client
System.out.println("Da ket noi duoc voi
while(true) {
server...");
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) {
}
MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET
35
System.err.println(e);
3. Lập Trình Socket hướng kết nối
Ví dụ : Ứng dụng phía Client
finally{ try{
if(br!=null) br.close(); if(pw!=null)pw.close(); }
catch(IOException e) {
}
System.err.println(e); }
}
MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET
36
}
3. Lập Trình Socket hướng kết nối
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
37
4. Lập trình Socket phi kết nối
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
38
4. Lập trình Socket phi kết nối
Đặ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
39
4. Lập trình Socket phi kết nối
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
40
4. Lập trình Socket phi kết nối
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
41
4. Lập trình Socket phi kết nối
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
42
4. Lập trình Socket phi kết nối
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
43
4. Lập trình Socket phi kết nối
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
44
4. Lập trình Socket phi kết nối
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
45
4. Lập trình Socket phi kết nối
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
46
4. Lập trình Socket phi kết nối
Gửi & Nhận Gói Tin UDP
MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET
47
4. Lập trình Socket phi kết nối
Gửi & Nhận Gói Tin UDP (tt)
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”);
MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET
48
4. Lập trình Socket phi kết nối
Gửi & Nhận Gói Tin UDP (tt)
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());
MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET
49
DataInputStream dis=new DataInputStream(bis);
4. Lập trình Socket phi kết nối
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
50
4. Lập trình Socket phi kết nối
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
51
4. Lập trình Socket phi kết nối
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
52
3. Lập Trình Socket hướng kết nối
Ví dụ : Ứng dụng phía Server
public class UDPEchoServer {
public final static int CONG_MAC_DINH=2000; public static void main(String args[]) {
int serverPort=CONG_MAC_DINH; try{
} catch(Exception e){ } try{
serverPort =Integer.parseInt(args[1]);
DatagramSocket ds =new DatagramSocket(serverPort); DatagramPacket dp=new DatagramPacket(new
while(true){
byte[1024],1024);
MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET
53
ds.receive(dp);
3. Lập Trình Socket hướng kết nối
Ví dụ : Ứng dụng phía Server
ByteArrayInputStream bis = new
BufferedReader dis; dis =new BufferedReader(new
ByteArrayInputStream(dp.getData());
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);
MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET
54
}
3. Lập Trình Socket hướng kết nối
Ví dụ : Ứng dụng phía Server
} catch(IOException e) {
catch(UnknownHostException e) { System.err.println(e);
System.err.println(e);
}
}
MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET
55
}
3. Lập Trình Socket hướng kết nối
Ví dụ : Ứng dụng phía Client
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{
MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET
56
InetAddress dc=InetAddress.getByName(hostname);
3. Lập Trình Socket hướng kết nối
Ví dụ : Ứng dụng phía Client
BufferedReader userInput=new BufferedReader(new
DatagramSocket ds =new DatagramSocket(clientPort); while(true){
InputStreamReader(System.in));
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);
DatagramPacket(receiveData,receiveData.length);
ds.send(sendPacket); DatagramPacket receivePacket=new
MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET
57
ds.receive(receivePacket);
3. Lập Trình Socket hướng kết nối
Ví dụ : Ứng dụng phía Client
ByteArrayInputStream bis =new
BufferedReader dis =new BufferedReader(new
ByteArrayInputStream(receivePacket.getData());
InputStreamReader(bis));
System.out.println(dis.readLine());
}
} catch(UnknownHostException e) { System.err.println(e);
} catch(IOException e) {
System.err.println(e);
}
}
MÔ HÌNH CLIENT-SERVER & LẬP TRÌNH SOCKET
58
}

