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
58 trang |
Chia sẻ: nguyenlam99 | Lượt xem: 1307 | Lượt tải: 0
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:
- lec_3_lap_trinh_socket_619.pdf