Đăng bởi : Nông Ngọc Hoài
4/18/2014
thuvienwinform - Để thực xây dựng chương trình gửi tin nhắn qua mạng LAN cần có một chương trình chạy trên máy chủ. Chức năng chính của nó là: Nhận kết nối từ các máy khách, sau khi tạo được kết nối thì bắt đầu việc gửi/nhận dữ liệu giữa máy chủ và máy khách. Khi nhận được dữ liệu (văn bản, hình ảnh, âm thanh,..) thì sẽ được xử lí trên máy chủ này. Có thể là lưu vào CSDL hoặc thực hiện các lệnh nhận được từ máy khách như gửi cho họ một tài liệu, hình ảnh, đoạn phim,...
Phần 1: [CHAT LAN] Phần 1: Giao thức TCP và System.NET. Những thành phần côt yếu để xây dựng chương trình chat qua mạng LAN
Tải project: https://www.dropbox.com/s/tydku6em1cjq8mb/thuvienwinform-CHATLANServer.rar (21KB)
Máy chủ dùng IP hiện tại của máy. Tham khảo thêm cách lấy IP này: http://thuvienwinform.blogspot.com/2013/10/code-lay-username-va-ip-cua-may.html
Cụ thể thì các bước để xây dựng một máy chủ như sau:
1/ Tạo (mở) một cổng kết nối logic (socket) để cho các máy khách tham gia gửi/nhận tin băng cổng này
2/ Đợi, lắng nghe và chấp nhận các kết nối từ máy khách
3/ Thực hiên giao tiếp với máy khách: Nhận dữ liệu từ máy khách, phân tích, xử lí sau đó gửi lại co máy khách. (lưu vào CSDL, chống nói tục@!, ...)
4/ Đóng socket
- Các code chat mạng LAN trên mạng thường thì bước 2 chỉ chấp nhận được 1 kết nối. Để chấp nhận nhiều kết nối thì ta cho bước 2 vào vòng lặp, khi kết nối thêm 1 khách sẽ chuyển bước 3 sang 1 luồng (thread) khác giao tiếp với máy khách đó.
- Trong này sử dụng khá nhiều về thread. Có thể xem thêm ở bài Thread trong C#: http://thuvienwinform.blogspot.com/2014/04/thread-trong-csharp.html
Các biến:
//Địa chỉ mặc định string IP = "127.0.0.1"; int PORT = 100; //Các luồng Thread thKetNoiDenServer, thKetNoiTaoServer, thLienLacKhach; TcpListener langNghe; //Biến dùng để gửi, nhận dữ liệu byte[] dlNhan = new byte[1024]; byte[] dlGui = new byte[1024]; //Socket tạo server và kết nối Socket socket; //Tạo 1 socket Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //Danh sách các máy khách kết nối đến ListcacMay = new List ();
1/ Tạo (mở) một cổng kết nối logic (socket)
//Tạo 1 socket Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint iep = new IPEndPoint(IPAddress.Parse(IP), PORT);//IP = "127.0.0.1"; PORT = 100; //Liên kết cổng s với địa chỉ IP và cổng s.Bind(iep); //Nhận tín hiệu từ các máy kết nối s.Listen(10);
Nếu có 1 IP tĩnh mua với nhà mạng thì chương trình này trở thành chat online luôn đó :)
2/ Đợi, lắng nghe và chấp nhận các kết nối từ máy khách
//Thêm máy khách socket = s.Accept(); //Lưu máy khách được thêm vào danh sách. Để dễ quản lí cacMay.Add(socket); //Thông báo kết nối với máy khách txtNoiDung.Text = txtNoiDung.Text + "Đã thêm 1 máy khách " + "\r\n"; //Mỗi máy khách sẽ được xử lí trong 1 luồng (thread) ThreadPool.QueueUserWorkItem(GiaoTiepTungKhach, socket);
với List
Cài tiến code bước 2 này để nhận được kết nối từ nhiều máy khách:
//Trong khi còn kết nối. Mỗi khi có tín hiệu từ máy khách đến sẽ thêm vào -> nhận đc nhiều máy khách cùng lúc
while (true) { //Thêm máy khách socket = s.Accept(); //Lưu máy khách được thêm vào danh sách. Để dễ quản lí cacMay.Add(socket); //Thông báo kết nối với máy khách txtNoiDung.Text = txtNoiDung.Text + "Đã thêm 1 máy khách " + "\r\n"; //Mỗi máy khách sẽ được xử lí trong 1 luồng (thread) ThreadPool.QueueUserWorkItem(GiaoTiepTungKhach, socket); }
3/ Thực hiên giao tiếp với máy khách
- Nhận văn bản gửi đến lưu vào biến tạm tmp
string tmp = "";
byte[] dlNhan = new byte[1024]; socket.Receive(dlNhan); tmp = Encoding.Unicode.GetString(dlNhan);
- Gửi văn bản đến các máy khách:
foreach (Socket s in cacMay) { s.Send(Encoding.Unicode.GetBytes(noiDung)); }
Để gửi được hình ảnh thì ta chuyển ảnh thành byte[] xong cũng gửi bình thường. Xem cách chuyển: http://thuvienwinform.blogspot.com/2014/03/code-up-anh-len-csdl-su-dung-kieu-image-trong-sqlserver.html
4/ Đóng socket
Khach.Close();
Để chương trình hoạt động thì ngày mai sẽ có project máy khách cho các bạn nha :)
19-5-2015: Thực ra với C# có nhiều cách để xây dựng một ứng dụng truyền dữ liệu qua mạng kiểu này. Sử dụng socket là cái nền tảng sơ khai nhất, mình sẽ hướng dẫn một bài khác cũng về vấn đề truyền dữ liệu qua mạng này trên một công nghệ khác (WCF hoặc Remote) đơn giản hơn nhiều, các bạn theo dõi blog để nhận bài sớm nhất nhé!
Tốn RAM dã man! Có cách nào khắc phục không
ReplyDeletedùng httpchanel hoặc tcpchanel gì gì đó
DeleteA CHO E DOWN BAI CHAT TCP CLIENT VA SERVER DC K A
DeleteChat Lan C. Phần 2: Code Máy Chủ (Server). Xử Lí Việc Gửi Nhận Với Nhiều Máy Khách >>>>> Download Now
Delete>>>>> Download Full
Chat Lan C. Phần 2: Code Máy Chủ (Server). Xử Lí Việc Gửi Nhận Với Nhiều Máy Khách >>>>> Download LINK
>>>>> Download Now
Chat Lan C. Phần 2: Code Máy Chủ (Server). Xử Lí Việc Gửi Nhận Với Nhiều Máy Khách >>>>> Download Full
>>>>> Download LINK 6b
Làm sao để đóng Client mà Server không xảy ra lỗi bác ơi? Em mở Client, sau đó kết nối đến Server, rồi đóng client đi... cứ thế nhiều lần ---> Server tự động bị đóng, xảy ra lỗi "has stoped working", có cách nào khắc phục không bác?
ReplyDeletedung luong do ku
Deletedung luong do ku
DeleteMình có VisualStudio rồi down file về sử dụng như thế nào đây ad, hướng dẫn với :()
ReplyDeleteMuốn đưa màn hình client sang server thì sao vậy bạn
ReplyDeleteBạn có video không gửi mình với.thanks nhiều!
ReplyDeleteChat Lan C. Phần 2: Code Máy Chủ (Server). Xử Lí Việc Gửi Nhận Với Nhiều Máy Khách >>>>> Download Now
ReplyDelete>>>>> Download Full
Chat Lan C. Phần 2: Code Máy Chủ (Server). Xử Lí Việc Gửi Nhận Với Nhiều Máy Khách >>>>> Download LINK
>>>>> Download Now
Chat Lan C. Phần 2: Code Máy Chủ (Server). Xử Lí Việc Gửi Nhận Với Nhiều Máy Khách >>>>> Download Full
>>>>> Download LINK