Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 44 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
44
Dung lượng
838,5 KB
Nội dung
MỤC LỤC DANH SÁCH CÁC HÌNH VẼ DANH SÁCH CÁC BẢNG BIỄU Chương 1: MỞ ĐẦU 1.1 Lý chọn đề tài: Hiện nay, mạng Lan có tiến vượt bậc ngày phổ biến đồi sống sinh hoat Điều làm cho nhu cầu liên lạc trao đổi thông tin thông qua mạng Lan ngày lớn Chính vậy, chương trình Chat mạng Lan xây dựng để đáp ứng phần nhu cầu cấp thiết 1.2 Mục đích đề tài: Xây dựng chương trình Chat hoạt động mạng Lan với chức như: gởi tin nhắn, tạo nhóm Chat lưu thông tin bạn bè 1.3 Đối tượng phạm vi nghiên cứu 1.3.1 Đối tượng nghiên cứu Tìm hiểu chế hoạt động Socket Thread NET Framwork từ viết ứng dụng Chat mạng Lan 1.3.2 Phạm vi nghiên cứu Chương trình Chat xây dựng với khả gởi văn qua lại user thông qua điều khiển Server mạng Lan Chương 2: KIẾN THỨC ỨNG DỤNG 2.1 Sơ lược lập trình Socket: 2.1.1 Khái niệm Địa cổng (Address & Port) Nguyên lý: Trong máy có nhiều ứng dụng muốn trao ứng dụng khác thông qua mạng (ví dụ có ứng dụng máy A muốn trao đổi với với ứng dụng máy B) Mỗi máy tính có đường truyền liệu (để gửi nhận) Vấn đề : Rất xảy "nhầm lẫn" liệu từ máy A gửi đến máy B khơng biết liệu gửi cho ứng dụng máy B? Giải quyết: Mỗi ứng dụng máy B gán số hiệu (mà ta quen gọi cổng : Port), số hiệu cổng từ 65535 Khi ứng dụng máy A muốn gửi cho ứng dụng máy B việc điền thêm số hiệu cổng (vào trường RemotePort) vào gói tin cần gửi Trên máy B, ứng dụng việc kiểm tra giá trị cổng gói tin xem có trùng với số hiệu cổng (đã gán – giá trị Localport) hay khơng? Nếu xử lý, cịn trái lại khơng làm (vì khơng phải mình) Như vậy: Khi cần trao đổi liệu cho hai ứng dụng cần phải biết thơng tin tối thiểu địa (Address) số hiệu cổng (Port) ứng dụng 2.1.2 Lớp IPAddress Trên Internet trạm (có thể máy tính, máy in, thiết bị …) có định danh nhất, định danh thường gọi địa (Address) Địa Internet tập hợp gồm số có giá trị từ 0-255 cách dấu chấm Để thể địa này, người ta viết dạng sau: Tên : Ví dụ May01, Server, … Địa IP đặt xâu: "192.168.1.1", "127.0.0.1" Đặt mảng byte, byte chứa số từ 0-255 Ví dụ để biểu diễn địa 192.168.1.1 với khai báo “byte[] DiaChi = new byte[4];”, ta viết: DiaChi(0) = 192; DiaChi(1) = 168; DiaChi(2) = 1; DiaChi(3) = 1; Hoặc số (long), có độ dài byte Ví dụ, với địa 192.168.1.1 giá trị là: 16885952 (đây số hệ thập phân xếp liền byte lại với 00000001 00000001 10101000 11000000 (Byte 0) 168 192 (Byte 3) Như vậy, để đổi địa chuẩn dạng số ta việc tính tốn cho thành phần Ví dụ: Đổi địa 192.168.1.2 số, ta tính sau : * 256 ^ + 1* 256 ^ + 168 * 256 ^ + 192 * 256 ^ Trong NET, IPAddress lớp dùng để mô tả địa Đây lớp sử dụng thao tác (truyền) vào lớp IPEndpoint, UDP, TCP, Socket … Bảng 2-1: Các thành phần lớp IpAddress Thành viên Static Mô tả Any Cung cấp địa IP (thường 0.0.0.0) để Server phải lắng nghe hoạt động Client tất Card mạng (sử dụng xây dựng Broadcast Server) Thuộc tính đọc Cung cấp địa IP quảng bá (Broadcast, thường Loopback 255.255.255.255), dạng số long Trả địa IP lặp (IP Loopback, ví dụ AddressFamily 127.0.0.1) Trả họ địa địa IP hành Nếu địa dạng IPv4 kết Internetwork, Phương thức IPAddress(Int64) IPAddress(Byte[]) GetAddressByte () HostToNetworkOrder() InternetworkV6 địa IPv6 Mô tả Tạo địa IP từ số long Tạo địa IP từ mảng Byte Chuyển địa thành mảng Byte Đảo thứ tự Byte số cho với thứ tự Byte địa IPAddress IsLoopback() Cho biết địa có phải địa lặp hay khơng? Ví dụ 1: Kiểm tra xem 192.168.1.300 có phải địa IP hợp lệ không private void KiemTra() { String Ip1 = "127.0.0.1"; String Ip2 = "999.0.0.1"; MessageBox.Show(IPAddress.TryParse(Ip1, new IPAddress(0))); MessageBox.Show (IPAddress.TryParse(Ip2, new IPAddress(1))); } Ví dụ 2: Chuyển địa hành mảng byte hiển thị thành sphần mảng private void KiemTra() { IpAddress Ip3 = new IPAddress(16885952); Byte[] b; b = Ip3.GetAddressBytes(); MessageBox.Show("Address: " & b(0) &"." & b(1) &"." & b(2) & "." & b(3)); } 2.1.3 Lớp IPEndpoint Trong mạng, để hai trạm trao đổi thơng tin với chúng cần phải biết địa (IP) số hiệu cổng mà hai bên dùng để trao đổi thông tin Lớp IPAddress cung cấp cho ta vế địa IP (IPAddress), thiếu vế thứ hai số hiệu cổng (Port number) Như vậy, lớp IPEndpoint lớp chứa đựng IPAddress Port number Đối tượng IPEndpoint dùng sau để truyền trực tiếp cho đối tượng UDP, TCP… Bảng 2-2: Các thành viên lớp IpEndPoint Phương thức khởi tạo Mô tả IPEndPoint(Int64, Int32) Tạo đối tượng lớp IPEndPoint, tham số truyền vào địa IP (ở dạng số) IPEndPoint(IPAddress, cổng dùng để giao tiếp Tạo đối tượng lớp IPEndPoint, Int32) Tham số truyền vào địa IPAddress Thuộc tính Address số hiệu cổng dùng để giao tiếp Mơ tả Trả thiết lập địa IP cho Endpoint (trả AddressFamily đối tượng IPAddress) Lấy loại giao thức mà Endpoint sử Port Phương thức Create() dụng Lấy gán số hiệu cổng Endpoint Mô tả Tạo Endpoint từ địa socket (socket ToString() address) Trả địa IP số hiệu cổng theo khn dạng địa chỉ: cổng Ví dụ: “192.168.1.1:8080” 2.1.4 Lớp UDP Giao thức UDP (User Datagram Protocol hay User Define Protocol) giao thức phi kết nối (connectionless) có nghĩa bên gửi liệu cho bên mà không cần biết bên sẵn sàng hay chưa? (Nói cách khác không cần thiết lập kết nối hai bên tiến hành trao đổi thông tin) Giao thức không tin cậy giao thức TCP tốc độ lại nhanh dễ cài đặt Ngoài ra, với giao thức UDP ta cịn gửi gói tin quảng bá (Broadcast) cho đồng thời nhiều máy Trong NET, lớp UDPClient (nằm namesapce System.Net.Sockets) đóng gói chức giao thức UDP Bảng 2-3: Các thành viên lớp UDPClient Phương thức khởi tạo Mô tả UdpClient () Tạo đối tượng (thể hiện) lớp UdpClient (AddressFamily) UDPClient Tạo đối tượng (thể hiện) lớp UDPClient Thuộc dòng địa UdpClient (Int32) UdpClient (IPEndPoint) (AddressFamily) định Tạo UdpClient gắn (bind) cổng cho Tạo UdpClient gắn (bind) IPEndpoint UdpClient(Int32, (gán địa IP cổng) cho Tạo UdpClient gán số hiệu cổng, AddressFamily) UdpClient(String, Int32) AddressFamily Tạo UdpClient thiết lập với trạm từ xa Phương thức BeginReceive() BeginSend() Close() Connect() EndReceive() EndSend() Receive (ref IPEndPoint) mặc định Mô tả Nhận liệu Không đồng từ máy xa Gửi không đồng liệu tới máy xa Đóng kết nối Thiết lập Default remote host Kết thúc nhận liệu không đồng Kết thúc việc gửi liệu không đồng Nhận liệu (đồng bộ) máy xa gửi (Đồng có nghĩa lệnh sau lệnh Receive thực thi Receive nhận liệu Cịn chưa nhận – dù chút – chờ (blocking)) Send() Gửi liệu (đồng bộ) cho máy xa Ví dụ 1: Tạo UDPClient gắn vào cổng 10 Gửi gói tin "Hello" tới ứng dụng UDP khác chạy máy có địa "127.0.0.1" cổng 1000 using System.Net; using System.Net.Sockets; public class UdpTest { const LOCAL_PORT = 10; const REMOTE_PORT = 1000; // Tạo UDP gắn (Bind) vào cổng 10 UpdCleint Sender = new UdpClient(LOCAL_PORT); privte void Gửi_Dữ_Liệu() { // Chuyển chuỗi "Hello there !" thành mảng byte để gửi Byte[] msg = System.Text.Encoding.UTF8.GetBytes("Hello there !"); // Gửi vào cổng 1000 máy 127.0.0.1 Sender.Send(msg, msg.Length, "127.0.0.1", REMOTE_PORT); } } Ví dụ 2: Tạo UDPClient gắn vào cổng 1000 nhận liệu từ ứng dụng khác gửi đến using System.Net; using System.Text; using System.Net.Sockets; namespace Test { public class UdpTest const LOCAL_PORT = 1000; const REMOTE_PORT = 10; UpdClient Receiver = new UdpClient(LOCAL_PORT); private void Nhận_Dữ_Liệu() { IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 100); Byte[] msg = Receiver.Receive(ep); String str; str = Encoding.UTF8.GetString(msg); '/Chuyển byte -> String MessageBox.Show(str); } } } 2.1.5 Lớp TCP (TCPClient) Mục đích lớp UDPClient dùng cho lập trình với giao thức UDP, với giao thức hai bên khơng cần phải thiết lập kết nối trước gửi mức độ tin cậy không cao Để đảm bảo độ tin cậy ứng dụng mạng, người ta dùng giao thức khác, gọi giao thức có kết nối : TCP (Transport Control Protocol) Trên Internet chủ yếu dùng loại giao thức này, ví dụ Telnet, HTTP, SMTP, POP3… Để lập trình theo giao thức TCP, MS.NET cung cấp hai lớp có tên TCPClient TCPListener Bảng 2-4: Các thành phần lớp TcpClient Phương thức khởi tạo Mô tả TcpClient() Tạo đối tượng TcpClient Chưa đặt thơng số TcpClient(IPEndPoint) Tạo TcpClient gắn cho EndPoint cục (Gán địa máy cục số hiệu cổng để sử dụng TcpClient(String,Int32) trao đổi thông tin sau) Tạo đối tượng TcpClient kết nối đến máy có địa số hiệu cổng truyền vào Các thuộc tính Available Client Connected RemoteHost địa IP chuẩn tên máy Mô tả Cho biết số byte nhận từ mạng có sẵn để đọc Trả Socket ứng với TCPClient hành Trạng thái cho biết kết nối đến Server hay Các hàm thành phần Close() chưa? Mô tả Giải phóng đối tượng TcpClient khơng đóng kết Connect(RemoteHost, nối Kết nối đến máy TCP khác có Tên số hiệu cổng RemotePort) GetStream() Trả NetworkStream để từ giúp ta gửi hay nhận liệu (Thường làm tham số tạo StreamReader StreamWriter để gửi nhận liệu dạng xâu ký tự) Khi gắn vào StreamReader StreamWriter ta gửi nhận liệu thông qua phương thức Readline, writeline tương ứng lớp Từ thành viên lớp TcpClient ta thấy rằng, việc kết nối thực gửi nhận đơn giản Theo trình tự sau: Bước 1: Tạo đối tượng TcpClient Bước 2: Kết nối đến máy chủ (Server) dùng phương thức Connect Bước 3: Tạo đối tượng StreamReader (Receive)và StreamWriter (Send) "nối" với GetStream cpPClient Bước 4: • Dùng đối tượng StreamWriter.Writeline/Write vừa tạo để gửi liệu • Dùng đối tượng StreamReader.Readline/Read vừa tạo để đọc liệu Bước 5: Đóng kết nối Nếu muốn gửi/nhận liệu mức byte (nhị phân) dùng NetworkStream (truyền GetStream cho NetworkStream) 2.1.6 Lớp TcpListener TCPListerner lớp cho phép người lập trình xây dựng ứng dụng Server (Ví dụ SMTP Server, FTP Server, DNS Server, POP3 Server hay server tự định nghĩa ….) Ứng dụng server khác với ứng dụng Client chỗ ln ln thực lắng nghe chấp nhận kết nối đến từ Client Bảng 2-5: Các thành phần lớp TcpListener Phương thức khởi tạo Mô tả TcpListener ( Int32) Tạo TcpListener lắng nghe cổng TcpListener (IPEndPoint) định Tạo TcpListener với giá trị Endpoint truyền TcpListener(IPAddress,Int32) vào Tạo TcpListener lắng nghe kết nối Phương thức AcceptSocket( ) AcceptTcpClient() đến địa IP cổng định Mô tả Chấp nhận yêu cầu kết nối chờ Chấp nhận yêu cầu kết nối chờ (Ứng dụng dừng lệnh có Pending() kết nối đến – “Blocking”) Cho biết liệu có kết nối chờ đợi không Start() Stop() Bắt đầu lắng nghe yêu cầu kết nối Dừng việc nghe Ví dụ: Tạo server đó, có client kết nối đến server chuyển xâu thành chữ HOA gửi trả lại cho Client using System.Net.Sockets; using System.Net; using System.IO; using System.Net.Sockets; using System.Threading; namespace TcpListenerTest { public class frmServer { TcpListener TCPServer = new TcpListener(21); bool Thoat = false; TcpClient[] Clients = new TcpClient[101]; int CurrClient = 0; public void Xu_Ly_Ket_Noi() { int LastClient = CurrClient - 1; TcpClient Con = Clients(LastClient); StreamReader Doc = new StreamReader(Con.GetStream()); StreamWriter Ghi = new StreamWriter(Con.GetStream()); string S = null; while (Thoat == false) { Application.DoEvents(); if (Doc.EndOfStream == false) { 10 Thêm Friend vào Fri endList Hình 3-8: Mơ hình xử lý thêm Friend Mơ tả: Khi người dùng chọn chức thêm Friend vào FriendList, hình thêm FriendList mở Người dùng nhập tên Friend sau Client gởi tên Friend lên cho Server Trước tiên, Server kiểm tra Friend có tồn hay khơng Tiếp theo, kiểm tra Friend thêm vào FriendList trước hay chưa Nếu Friend chưa có FriendList, Server thêm Friend vào FriendList người dùng Cuối cùng, Server gởi kết công việc cho Client Dựa vào kết nhận được, Client thông báo cho người dùng biết việc thêm thành cơng hay thất bại (có hai nguyên nhân thất bại Friend không tồn Friend có FriendList rồi) Xóa Friend khỏi FriendList: Mơ hình xử lý: 30 Xóa Friend khỏi FriendList Hình 3-9: Mơ hình xử lý xóa Friend Mô tả: Khi người dùng chọn chức xóa Friend vào FriendList, hình thêm FriendList mở Người dùng nhập tên Friend sau Client gởi tên Friend lên cho Server Trước tiên, Server kiểm tra Friend có tồn hay khơng Tiếp theo, kiểm tra Friend thêm vào FriendList trước hay chưa Nếu Friend có FriendList, Server xóa Friend khỏi FriendList người dùng Cuối cùng, Server gởi kết công việc cho Client Dựa vào kết nhận được, Client thơng báo cho người dùng biết việc Xóa thành cơng hay thất bại (có hai ngun nhân thất bại Friend khơng tồn Friend chưa có FriendList) đồng thời cập nhật lại hình cần Ghi chú: Chức gọi người dùng nhấn phím Delete Listbox FriendList 3.1.4.4 Các xử lý Group Chat Khi User tạo Group: Mơ hình xử lý: 31 T ạo Group Hình 3-10: Mơ hình xử lý tạo Group Mô tả: Khi người dùng chọn chức Invite Group hình tạo Group xuất Người dùng nhập danh sách Users muốn mời nhập thêm Invite Message nhấn Invite Client tự phát sinh tên Group gởi kèm với danh sách Users muốn mời đồng thời mở thêm Tab Group Chat Server lọc Users Online danh sách Users mời Sau đó, Server gởi lời mời kèm theo tên người mời đến Users mời Khi User đồng ý gia nhập Group: Mơ hình xử lý: 32 Đồng ý gia nhập Group Hình 3-11: Mơ hình xử lý đồng ý gia nhập Group Mô tả: Khi người dùng đồng ý lời mời gia nhập nhóm, Client gởi thông báo đồng ý cho Server Server kiểm tra xem Group lưu hay chưa (Group chưa lưu chưa có người dùng đồng ý tham gia) Sau đó, Server lưu người dùng vào GroupDetail Cuối cùng, Server gởi tên tất Users tham gia Group cho người dùng, đồng thời gởi thông báo đến cho Users Group người dùng đồng ý gia nhập nhóm Khi User khỏi Group: Mơ hình xử lý: 33 Rời khỏi Group Hình 3-12: Mơ hình xử lý khỏi Group Mơ tả: Khi người dùng tắt Tab Group Chat, Client gởi thơng báo khỏi Group cho Server Server trước tiên kiểm tra người dùng có phải người tạo Group hay không Nếu không phải, Server gởi thông báo tới Users khác Group Cuối cùng, Server cập nhật lại GroupDetail Khi User hủy Group: Mơ hình xử lý: 34 Hủy Group Hình 3-13: Mơ hình xử lý hủy Group Mơ tả: Khi người dùng tắt Tab Group Chat, Client gởi thơng báo khỏi Group cho Server Server trước tiên kiểm tra người dùng có phải người tạo Group hay không Nếu đúng, Server gởi thông báo hủy Group tới Users khác Group Cuối cùng, Server xóa Group khỏi GroupDetail GroupChat Ghi chú: Khi nhận thông báo hủy Group từ Users, Client tắt Tab Group Chat tương ứng đồng thời thông báo cho người dùng Khi User gởi tin nhắn tới thành viên Group: Mơ hình xử lý: 35 Gởi tin nhắn Group Hình 3-14: Mơ hình xử lý gởi tin nhắn Group Mô tả: Khi người dùng nhập tin nhắn nhấn button Send Tab Group Chat, Client gởi tin nhắn tên Group cho Server Dựa vào tên Group nhận được, Server tìm tất Users tham gia Group gởi tin nhắn kèm theo tên người gởi đến Users 3.2 Thiết kế liệu 3.2.1 Chuẩn hóa liệu: Users (ID, Username, Password, State, Fullname, Email, Address) FriendList(UserID, FriendID) OfflineMessage(UserID, SenderID, SendTime, Message) GroupChat(GroupID, UserID, GroupName, CreateTime) GroupDetail(FriendID, GroupID) 36 3.2.2 Mơ hình liệu mức vật lý: Hình 3-15: Mơ hình liệu mức vật lý 3.2.3 Thiết kế liệu: Gồm có bảng Users, FriendList, OfflineMessage, GroupChat, GroupDetail để lưu trử thông tin user để đăng nhập, quan hệ user, lưu tin nhắn offline user lưu tạm thời thơng tin nhóm Chat Table Users Chức năng: Lưu thông tin User Danh sách thuộc tính: Bảng 3-9: Table Users STT Tên thuộc tính ID Username Password State Fullname Email Address Table FriendList Kiểu liệu int (4) varchar (20) varchar (15) bit (1) nvarchar (50) varchar (30) nvarchar (50) Diễn giải Tự động tăng, Khóa Tên đăng nhập Mật đăng nhập Trạng thái User Tên đầy đủ User Email User Địa User Chức năng: Lưu thông tin quan hệ User Danh sách thuộc tính: 37 Bảng 3-10: Table FriendList STT Tên thuộc tính Kiểu liệu UserID int (4) FriendID int (4) Table OfflineMessage Diễn giải ID User, Khóa ID Friend, Khóa Chức năng: Lưu tin nhắn offline User Danh sách thuộc tính: Bảng 3-11: Table OfflineMessage STT Tên thuộc tính Kiểu liệu UserID int (4) SenderID int (4) SendTime datetime (8) Diễn giải ID người nhận, Khóa ID người gởi, Khóa Thời điểm gởi tin nhắn, Khóa Nội dung tin nhắn Message Table GroupChat nvarchar (500) Chức năng: Lưu tạm thời thơng tin nhóm Chat Danh sách thuộc tính: Bảng 3-12: Table GroupChat STT Tên thuộc tính Kiểu liệu GroupID int (4) UserID int (4) GroupName varchar (20) CreateTime datetime (8) Table GroupDetail Diễn giải Tự động tăng, Khóa ID User tạo nhóm Tên nhóm Thời điểm tạo nhóm Chức năng: Lưu thơng tin chi tiết nhóm Chat Danh sách thuộc tính: Bảng 3-13: Table GroupDetail STT Tên thuộc tính Kiểu liệu GroupID int (4) FriendID int (4) Diễn giải ID Group, Khóa ID của User thành viên Group, Khóa 3.2.4 Mơ tả ràng buộc toàn vẹn: Ràng buộc 1: Username Table Users không trùng Ràng buộc 2: UserID FriendID Table FriendList phải tồn Table Users 38 Ràng buộc 3: UsersID Table GroupChat phải tồn Table Users Ràng buộc 4: GroupID Table GroupDetail phải tồn Table GroupChat Ràng buộc 5: FriendID Table GroupDetail phải tồn Table Users Ràng buộc 6: SenderID UserID Table OfflineMessage phải tồn Table Users 3.3 Thiết kế giao diện 3.3.1 Màn hình đăng nhập Hình 3-16: Màn hình đăng nhập 3.3.2 Màn hình 39 Hình 3-17: Màn hình 3.3.3 Màn hình thêm Friend Hình 3-18: Màn hình thêm Friend 3.3.4 Màn hình xóa Friend Hình 3-19: Màn hình xóa Friend 3.3.5 Màn hình Chat With Hình 3-20: Màn hình Chat With 40 3.3.6 Màn hình Invite Group Hình 3-21: Màn hình Invite Group 3.3.7 Màn hình Invite Another Hình 3-22: Màn hình Invite Another Chương 4: CÀI ĐẶT – THỬ NGHIỆM 4.1 Cài đặt chương trình 4.2 Hướng dẫn sử dụng Chương 5: KẾT LUẬN 5.1 Kết đạt Đề tài “Chương trình Chat” thực nội dung sau: 41 Tìm hiểu cách thức lập trình Socket lập trình đa luồng mơi trường NET Tìm hiểu cách thức hoạt động chương trình Chat đơn giản Ưu nhược điểm chương trình: Ưu điểm: Nhược điểm: Chưa gởi kèm hình ảnh Chat Chưa có chức gởi File Users Chỉ hổ trợ Chat Text đơn 5.2 Hướng phát triển Về bản, nghiên cứu đạt yêu cầu đặt Tuy nhên có điều kiện, đồ án cố gắng phát triển thêm chức sau: Hỗ trợ gởi hình ảnh Chat Hỗ trợ chức gởi file Hỗ trợ chức Voice Chat Webcam 42 TÀI LIỆU THAM KHẢO Tài liệu: [1] Dương Quang Thiện, 2005, NET tồn tập [2] Nguyễn Ngọc Bình Phương, 2005, Các giải pháp lập trình C# [3] Sybex, 2003, C-Sharp Network Programming Các trang Web [1] http://www.codeproject.com [2] http://www.codeguru.com 43 ... tin mạng Lan phát triển theo Chính vậy, chương trình Chat phục vụ cho nhu cầu liên lạc, trao đổi thông tin mạng Lan cần thiết 3.1.2 Yêu cầu đề ra: Yêu cầu đặt xây dựng chương trình Chat hoạt động. .. hiểu cách thức hoạt động chương trình Chat đơn giản Ưu nhược điểm chương trình: Ưu điểm: Nhược điểm: Chưa gởi kèm hình ảnh Chat Chưa có chức gởi File Users Chỉ hổ trợ Chat Text đơn 5.2... NGHIỆM 4.1 Cài đặt chương trình 4.2 Hướng dẫn sử dụng Chương 5: KẾT LUẬN 5.1 Kết đạt Đề tài ? ?Chương trình Chat? ?? thực nội dung sau: 41 Tìm hiểu cách thức lập trình Socket lập trình đa luồng mơi