Tôi đã thấy nhiều tài nguyên ở đây về SO về Ổ cắm. Tôi tin rằng không ai trong số họ bao gồm các chi tiết mà tôi muốn biết. Trong ứng dụng của tôi, máy chủ thực hiện tất cả việc xử lý và gửi các bản cập nhật định kỳ cho các máy khách.Bắt đầu lập trình socket trong C# - Các phương pháp hay nhất
Mục đích của bài đăng này là bao gồm tất cả các ý tưởng cơ bản cần thiết khi phát triển ứng dụng socket và thảo luận các phương pháp hay nhất. Dưới đây là những điều cơ bản mà bạn sẽ thấy với hầu như tất cả các ứng dụng dựa trên socket.
1 - Binding và lắng nghe trên một ổ cắm
Tôi đang sử dụng đoạn mã sau. Nó hoạt động tốt trên máy của tôi. Tôi có cần phải quan tâm đến điều gì khác khi triển khai trên máy chủ thực không?
IPHostEntry localHost = Dns.GetHostEntry(Dns.GetHostName());
IPEndPoint endPoint = new IPEndPoint(localHost.AddressList[0], 4444);
serverSocket = new Socket(endPoint.AddressFamily, SocketType.Stream,
ProtocolType.Tcp);
serverSocket.Bind(endPoint);
serverSocket.Listen(10);
2 - dữ liệu nhận
Tôi đã sử dụng một mảng byte kích thước 255. Vì vậy, khi tôi nhận dữ liệu lớn hơn 255 byte, tôi cần gọi phương thức nhận cho đến khi tôi nhận được dữ liệu đầy đủ, đúng không? Khi tôi nhận được dữ liệu đầy đủ, tôi cần phải nối thêm tất cả các byte nhận được cho đến nay để nhận được thông báo đầy đủ. Đúng không? Hoặc là có một cách tiếp cận tốt hơn?
3 - gửi dữ liệu và xác định độ dài dữ liệu
Kể từ khi không có cách nào trong giao thức TCP để tìm độ dài của tin nhắn để nhận, tôi đang lên kế hoạch để thêm chiều dài vào tin nhắn. Đây sẽ là byte đầu tiên của gói. Vì vậy, hệ thống khách hàng biết có bao nhiêu dữ liệu có sẵn để đọc.
Bất kỳ cách tiếp cận nào khác tốt hơn?
4 - Đóng client
Khi khách hàng được đóng lại, nó sẽ gửi một thông điệp tới máy chủ cho thấy sự gần gũi. Máy chủ sẽ xóa các chi tiết khách hàng khỏi danh sách khách hàng của nó. Sau đây là mã được sử dụng ở phía máy khách để ngắt kết nối ổ cắm (phần nhắn tin không được hiển thị).
client.Shutdown(SocketShutdown.Both);
client.Close();
Bất kỳ đề xuất hoặc vấn đề nào?
5 - Đóng server
Server gửi thông điệp tới tất cả khách hàng cho thấy tắt máy. Mỗi máy khách sẽ ngắt kết nối socket khi nó nhận được thông báo này. Khách hàng sẽ gửi tin nhắn đóng đến máy chủ và đóng. Khi máy chủ nhận được tin nhắn gần gũi từ tất cả các máy khách, nó sẽ ngắt kết nối ổ cắm và ngừng nghe. Gọi Vứt bỏ trên mỗi ổ cắm máy khách để giải phóng tài nguyên. Đó có phải là cách tiếp cận chính xác không?
6 - disconnections client Unknown
Đôi khi, một khách hàng có thể ngắt kết nối mà không cần thông báo cho máy chủ. Kế hoạch của tôi để xử lý này là: Khi máy chủ gửi tin nhắn đến tất cả các máy khách, hãy kiểm tra trạng thái ổ cắm. Nếu nó không được kết nối, loại bỏ khách hàng đó khỏi danh sách khách hàng và đóng socket cho máy khách đó.
Mọi trợ giúp sẽ tuyệt vời!
Tôi đã có vấn đề với IPAddress lắng nghe trên một số phiên bản cũ của cửa sổ. Sử dụng IPAddress ipAddress = new IPAddress (byte mới [] {0, 0, 0, 0}); dường như là tốt nhất cho tôi! – clamchoda