Tài liệu Lập trình Socket
Chương I: Cơ sở về mạng .1
1. Cấu trúc mạng .1
2. TCP.2
3. UDP .3
4. Các cổng giao tiếp .4
Chương II: Socket .6
1. Tổng quan về Socket .6
1.1. Lịch sử hình thành.6
1.2. Định nghĩa .7
1.3. Nguyên lý hoạt động.7
Chương III. Hỗ trợ lập trình socket trong Java.10
3.1. Ví dụ sử dụng giao thức hướng kết nối TCP: .11
3.2. Ví dụ sử dụng giao thức hướng kết nối TCP: .15
Phần 2. Xây dựng ứng dụng .20
Chương 1. Phân tích thiết kế .20
1. Giới thiệu.20
2. Phân tích hệ thống.20
2.1 Mô hình chung.20
2.2 Mô hình ca sử dụng .21
2.3 Sơ đồ tuần tự.21
2.4 Sơ đồ cộng tác.23
2.5 Biểu đồ lớp.24
Chương 2. Xây dựng chương trình.25
1. Xây dựng chương trình cho Server ( Lớp SocketServer.java).25
2. Xây dựng chương trình cho Client ( Lớp SocketClient.java).26
y dựng hai lớp
TimeServer - Chương trình phía Server
TimeClient - Chương trình phía Client
Lớp TimeServer
import java.io.*;
import java.net.*;
import java.util.*;
public class TimeServer {
static DatagramSocket socket;
public static void main(String[] argv) {
try {
- 16 -
socket = new DatagramSocket(7654);
}catch (SocketException e) {
System.err.println("Unable to create socket");
e.printStackTrace();
System.exit(1);
}
DatagramPacket datagram;
datagram = new DatagramPacket(new byte[1], 1);
while (true) {
try {
socket.receive(datagram);
respond(datagram);
}catch (IOException e) {
e.printStackTrace();
}
}
}
static void respond(DatagramPacket request) {
ByteArrayOutputStream bs;
bs = new ByteArrayOutputStream();
DataOutputStream ds = new DataOutputStream(bs);
try {
ds.writeLong(System.currentTimeMillis());
}catch (IOException e) {
}
DatagramPacket response;
byte[] data = bs.toByteArray();
response = new DatagramPacket(data, data.length,
request.getAddress(), request.getPort());
try {
socket.send(response);
}catch (IOException e) {
// Give up, we've done our best.
- 17 -
}
}
}
Tiến trình thực hiện ở đây như sau:
¾ Tạo socket phía Server để chờ yêu cầu kết nối
socket = new DatagramSocket(7654);
¾ Nhận yêu cầu từ phía Client
socket.receive(datagram);
¾ Gửi trả yêu cầu về cho Client
response = new DatagramPacket(data, data.length,
request.getAddress(), request.getPort());
socket.send(response);
Lớp TimeClient
import java.io.*;
import java.net.*;
import java.util.*;
public class TimeClient {
private static boolean usageOk(String[] argv) {
argv[]
if (argv.length != 1) {
String msg = "usage is: " + "TimeClient server-name";
System.out.println(msg);
return false;
}
return true;
}
public static void main(String[] argv) {
if (!usageOk(argv))
System.exit(1);
DatagramSocket socket;
- 18 -
try {
socket = new DatagramSocket();
}catch (SocketException e) {
System.err.println("Unable to create socket");
e.printStackTrace();
System.exit(1);
return;
}
long time;
try {
byte[] buf = new byte[1];
socket.send(new DatagramPacket(buf, 1,
InetAddress.getByName(argv[0]), 7654));
DatagramPacket response = new DatagramPacket(new byte[8],8);
socket.receive(response);
ByteArrayInputStream bs;
bs = new ByteArrayInputStream(response.getData());
DataInputStream ds = new DataInputStream(bs);
time = ds.readLong();
}catch (IOException e) {
e.printStackTrace();
System.exit(1);
return;
}
System.out.println(new Date(time));
socket.close();
}
}
Tiến trình hoạt động của phía Client như sau:
¾ Tạo socket
socket = new DatagramSocket();
¾ Gửi dữ liệu đến Server
- 19 -
socket.send(new DatagramPacket(buf, 1,
InetAddress.getByName(argv[0]), 7654));
¾ Nhận dữ liệu trả lời từ Server
DatagramPacket response = new DatagramPacket(new byte[8],8);
socket.receive(response);
- 20 -
Phần 2. Xây dựng ứng dụng
Chương 1. Phân tích thiết kế
1. Giới thiệu
Trong thời đại ngày nay, thông tin liên lạc là một vấn đề vô cùng quan trọng,
các hệ thống thông tin ra đời đã đáp ứng được phần nào nhu cầu đó. Đặc biệt là
giao tiếp qua mạng máy tính đã trở thành xu thế thời đại bởi không chỉ là nội
dung, hình thức, kinh tế mà còn cả bởi tốc độ và tính thuận tiện của nó.
Một trong những phương thức trao đổi đang được sử dụng rộng rãi bây giờ
chính là CHAT(mà ta tạm dịch la tán gẫu) qua mạng.
Trên cơ sở tìm hiểu thực tế, và vì điều kiện thời gian không cho phép chúng
tôi có xây dựng một chương trình CHAT cho mạng LAN dựa trên nền tảng lập
trình Socket với mô hình Client/Server bằng ngôn ngữ JAVA.
2. Phân tích hệ thống
2.1 Mô hình chung
Như đã trình bày trên, yêu cầu của bài toán Chat rất ngắn gọn, ở đây về phía
người chat thì chỉ cần tham gia kết nối với máy chủ(đăng nhập) và nếu được
phép(đúng Nickname và Password) họ bắt đầu có thể trao đổi thông tin với nhau,
thay đổi một số giao diện người dùng và nếu không họ có thể thoát ra khỏi hệ
thống. Còn phía nhà quản lý, anh ta cho phép những ai được quyền tham gia
mạng Chat và theo dõi chặt chẽ mọi diễn biến của các tiến trình trao đỏi thông tin
của các khách hàng, thông báo những diễn biến đột xuất như có thêm một khách
hàng đăng nhập hay nột khách hàng rời khỏi hệ thống và ghi lại nhật ký của tiến
trình các khách hàng tham gia trên mạng.
Như vậy, chương trình được xây dựng cho hai lớp đối tượng cơ bản là phía
máy Client và phía máy Server. Mỗi đối tượng sẽ có các chức năng riêng thực
hiện các vấn đề của bài toán CHAT qua mạng.
Với Server, nó phải quản lý chung các thao tác mà Client đưa tới. Để làm điều
này Server phải mở một cổng và sẽ lắng nghe trên đó. Khi nhận được thông tin từ
phía Client qua cổng nó sẽ phải kiểm tra đăng nhập và ra các quyết định cần thiết,
đồng thời nó cũng luôn theo dõi các tiến trình của máy Client như các quá trình
vào ra và ghi lại nhật ký, gửi các message tới các Client khác, đưa các thông tin
đăng nhập tới các máy khách,...Phía Client khi tham gia mạng phải kết nối tới
Server, nếu thành công thì sẽ bắt đầu tiến trình trao đổi thông điệp do Server quản
lý, đồng thời nó có quyền thiết lập một số thuộc tính về giao diện.
Khi một Client ngắt kết nối, Server sẽ đưa thông báo tới tất cả các máy Client
khác trên mạng mà còn đang kết nối, các máy này sẽ có các thông báo về máy rời
khỏi mạng.
Như vậy, toàn bộ tiến trình của hệ thống sẽ gồm các công đoạn chính như sau:
¾ Server mở cổng và lắng nghe trên cổng đó
- 21 -
¾ Client tham gia đăng nhập kết nối với Server trên cổng đã mở thông qua
Nickname và Password được cung cấp bởi Server
¾ Client bắt đầu quá trình trao đổi thông điệp với nhau bằng cách gửi thông
điệp tới Server và Server sẽ gửi thông diệp đó tới Client nhận (nếu gửi
theo kiểu cá nhân) hoặc gửi cho tất cả các Client trên mạng(nếu Client đó
gửi theo kiểu công cộng). Một Client kết nối thành công sẽ được Server
thông báo cho tất cả các Client kết nối trước đó biết và Server sẽ ghi lại
các quá trình này trong nhật ký của nó.
¾ Khi một Client không tham gia nữa, Server sẽ đóng kết nối và thông báo
tới tất cả các Client còn đang tham gia trên mạng
2.2 Mô hình ca sử dụng
Trên cơ sở mô hình như trên, chúng tôi xây dựng mô hình ca sử dụng như sau:
Các Actor trong mô hình:
¾ Client
¾ Server
Các khung nhìn:
¾ Đăng nhập
¾ Trao đổi thông điệp
¾ Kết thúc(Thoát khỏi hệ thống)
Ta có mô hình ca sử sụng của hệ thống chat như sau:
Hình 1: Mô hình ca sử dụng của hệ thống chat
2.3 Sơ đồ tuần tự
Đăng nhập:
D a n g n h a p
T ra o d o i T D
C lie n t
K e t t h u c C h a t
S e rve r
- 22 -
Client Server
Gui yeu cau ket noi
Kiem tra Nickname & Password
G ui N ick va PassW ord
Cho dang nhap hoac huy bo
Hình 2: Sơ đồ tuần tự của quá trình đăng nhập hệ thống
Trao đổi thông điệp:
Client1 S erver Client2
G ui t hong diep cho Client2 gui cho Client2
Gui cho Client1
Gui cho Client1
Gu i toi t at ca Client Gui cho tat ca Client
Hình 3: Sơ đồ tuần tự của quá trình trao đồi thông điệp
- 23 -
Thoát kết nối:
Client1 Server Client2
Gui hanh dong thoat
Dap ung, Dong ket noi
Thong bao cho Client2 biet
Hình 4: Sơ đồ tuần tự của quá trình kết thúc ra khỏi hệ thống
2.4 Sơ đồ cộng tác
: Processing
: AdminManager
Mo cong& Lang nghe
: Us erList
: Setting
1: yeu cau ket noi
2: Dap ung yeu cau
Lay thong tin thiet lap
lay thong tin User
Hình5: Sơ đồ cộng tác của hệ thống
- 24 -
2.5 Biểu đồ lớp
Hình 6: Biểu đồ lớp của hệ thống
C h a t S e rve r
C lie n t S e t t in g
C l ie n t S e t t in g ()
S o c k e t C l ie n t
S oc k e t C li e nt ()
m a in ()
S o c k e t S e rve r
m a in ()
S o c k e t S e rve r()
B a s e C lie n t
B a s e S erv er
C h a t C l ie nt
C h a t M e s s a g e
C h a t M e s s a g e ()
L o g o n F a i le d E x c e p t io n
L o g o n F a il e dE x c e p t io n ()
- 25 -
Chương 2. Xây dựng chương trình
Chương trình dưới đây dược thiết kế trên cơ sỏ lập trình Socket và tham
khảo các tài liệu sau:
Lập trình hướng đối tượng với Java - TS. Đoàn Văn Ban – Viện
CNTT
Kỹ thuật lập trình Java - KS. Đậu Quang Tuấn và Nguyễn Viết Linh
Lập trình mạng bằng Java - Trung tâm tin hoc Trí Đức
Thinking in Java
Java tutorial - Sun
Sau đây ta đi xây dựng chương trình
1. Xây dựng chương trình cho Server ( Lớp SocketServer.java)
Server sẽ làm nhiệm vụ lắng nghe các yêu cầu kết nối từ các Client trên một
cổng cụ thể thông qua đối tượng ServerSocket, các yêu cầu kết nối được kiểm tra,
xếp vào hàng đợi và chờ Server chấp nhận.
Ta có sơ đồ thiết kế cơ bản của lớp SocketServer như sau:
Lắng nghe các kết
nối trên cổng 2222
Chấp nhận kết nối
và trả về Socket
tương ứng
Khởi tạo Thread
phục vụ kết nối
Khởi tạo dòng
xuất
Socket và dòng
xuất được quản lý
trong bảng băm
- 26 -
2. Xây dựng chương trình cho Client ( Lớp SocketClient.java)
Ta thiết kế một giao diện người sử dụng bao gồm một vùng nhập thông điệp,
một vùng hiển thị thông điệp, một vùng hiển thị danh sách các User tham gia
mạng, hai nút lệnh gửi thông điệp và nút thoát. Thiết lập một Socket yêu cầu kết
nối tới Server với Nickname, tên máy chủ và cổng dịch vụ xác định. Sau khi kết
nối được chấp nhận, nó tạo ra hai dòng xuất và nhập tương ứng với socket này.
hai dòng xuất và nhập làm nhiệm cụ nhận và gửi thông điệp.
Ta có sơ đồ thiết kế cơ bản sau:
Chi tiết về chương trình sẽ được giới thiệu cụ thể riêng với các file kèm theo.
Tạo đối tượng Server yêu
cầu kết nối tới máy chủ
Thiết lập dòng xuất
nhập tương ứng
Thêm dữ liệu vào
vùng nhập
Đọc dữ liệu từ dòng nhập
Lấy chuỗi ký tự từ
vùng nhập và gửi tới
Server trên dòng xuất
Client
Lắng nghe sự kiện
người sử dụng nhấn
chuột
File đính kèm:
tai_lieu_lap_trinh_socket.pdf

