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