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

Đăng bở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
List cacMay = 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 cacMay = new 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é!


{ 11 comments }

  1. Anonymous4/29/2014

    Tốn RAM dã man! Có cách nào khắc phục không

    ReplyDelete
    Replies
    1. Anonymous5/01/2014

      dùng httpchanel hoặc tcpchanel gì gì đó

      Delete
    2. A CHO E DOWN BAI CHAT TCP CLIENT VA SERVER DC K A

      Delete
    3. Anonymous3/13/2022

      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 Now

      >>>>> 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

      Delete
  2. 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?

    ReplyDelete
  3. Mình có VisualStudio rồi down file về sử dụng như thế nào đây ad, hướng dẫn với :()

    ReplyDelete
  4. Muốn đưa màn hình client sang server thì sao vậy bạn

    ReplyDelete
  5. Bạn có video không gửi mình với.thanks nhiều!

    ReplyDelete
  6. Anonymous3/13/2022

    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 Now

    >>>>> 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

    ReplyDelete

Nhận ngay 100$ cho VPS

Mua hàng ủng hộ page

Ủng hộ page

Nhãn

Code (45) Team Foundation Server (17) Database (14) News (14) product (13) toolbox (10) Linq (9) SoftDesign (8) XNA (6) API (5) Project (5) item (4)

- Bản quyền thuộc về Thư Viện WinForm - Giao diện: Metrominimalist - Thiết kế: Johanes Djogan -