2010-03-17 24 views
6

Tôi đang triển khai một số nội dung mạng trong dự án của mình. Nó đã được quyết định rằng thông tin liên lạc là rất quan trọng và chúng tôi muốn làm điều đó một cách đồng bộ. Vì vậy, khách hàng gửi một cái gì đó máy chủ thừa nhận.Có một số phương pháp hay nhất về lập trình Mạng chung không?

Có một số phương pháp hay nhất chung cho sự tương tác giữa máy khách và máy chủ. Ví dụ nếu không có câu trả lời từ máy chủ thì máy khách sẽ tự động thử lại không? Có nên có khoảng thời gian chờ trước khi thử lại không? Điều gì sẽ xảy ra nếu xác nhận không thành công? Tại thời điểm nào chúng ta ngắt kết nối và kết nối lại? Có một số tài liệu? Tôi đã thực hiện tìm kiếm nhưng không có gì thực sự xuất hiện.

Tôi đang tìm các phương pháp hay nhất nói chung. Tôi đang thực hiện điều này trong C# (có lẽ với ổ cắm) vì vậy nếu có bất cứ điều gì. Net cụ thể sau đó xin vui lòng cho tôi biết quá.

+1

http://stackoverflow.com/questions/2368580/socket-protocol-fundamentals có thể được quan tâm. –

Trả lời

6

Quy tắc mạng đầu tiên - bạn đang gửi tin nhắn, bạn không gọi chức năng.

Nếu bạn tiếp cận mạng theo cách đó và không giả vờ rằng bạn có thể gọi các chức năng từ xa hoặc có "đối tượng từ xa", bạn sẽ ổn. Bạn không bao giờ có một "điều" thực tế ở phía bên kia của kết nối mạng - những gì bạn có về cơ bản là một bức tranh về điều đó.

Mọi thứ bạn nhận được từ mạng là dữ liệu cũ. Bạn đang chưa bao giờ cập nhật. Bởi vì điều này, bạn cần đảm bảo rằng thông điệp của bạn mang ngữ nghĩa chính xác - ví dụ, bạn có thể tăng hoặc giảm giá trị nào đó bằng giá trị, bạn không nên đặt giá trị của nó thành giá trị hiện tại cộng hoặc trừ giá trị hiện tại khác (như giá trị hiện tại có thể thay đổi theo thời gian tin nhắn của bạn đến đó).

2

Nếu cả client và server được viết bằng .NET/C# Tôi muốn giới thiệu WCF insted của socket thô vì nó giúp bạn tiết kiệm một từ rất nhiều mã hệ thống ống nước với serialization và deserialization, đồng bộ hóa các thông điệp, vv

Điều đó có thể không thực sự trả lời câu hỏi của bạn về thực tiễn tốt nhất ;-)

1

Điều đầu tiên cần làm là mô tả mạng cụ thể của bạn về tốc độ, xác suất bị mất tin nhắn, lưu lượng danh nghĩa và cao điểm, tắc nghẽn, khách hàng và máy chủ MTBF, ...

Sau đó, chỉ khi đó bạn quyết định những gì bạn cần cho y giao thức của chúng tôi. Trong nhiều trường hợp, bạn không cần các cơ chế xử lý lỗi phức tạp và có thể triển khai một dịch vụ đáng tin cậy với UDP thuần túy.

Trong một số trường hợp, bạn sẽ cần phải xây dựng một thứ gì đó mạnh mẽ hơn để duy trì trạng thái toàn cầu nhất quán giữa nhiều máy được kết nối thông qua mạng mà bạn không thể tin tưởng.

1

Điều quan trọng nhất tôi thấy là thông điệp luôn luôn nên có quốc tịch (đọc lên trên REST nếu điều này có ý nghĩa gì đối với bạn)

Ví dụ, nếu ứng dụng của bạn theo dõi số lượng lô hàng qua mạng không gửi gia tăng cập nhật (+ x) nhưng luôn là tổng số mới.

+0

Điều đó có ý nghĩa hoàn hảo. Lời khuyên tốt. May mắn cho chúng tôi tin nhắn của chúng tôi là không quốc tịch. Đây là sự trùng hợp nhiều hơn so với thiết kế mặc dù :) – uriDium

+0

Tốt cho bạn! Gần đây tôi đã phải thay đổi một ứng dụng có các thông điệp chuyển đổi cho tất cả mọi thứ, mà cuối cùng sẽ luôn bị lẫn lộn. –

+0

Không quốc tịch là một hướng dẫn chung tốt, nhưng không phải * luôn luôn * bắt buộc. Một số tình huống thực sự yêu cầu các thông điệp phi trạng thái - nó phụ thuộc vào tình huống. Tuy nhiên, đi đầu tiên không quốc tịch là một heuristic tuyệt vời. Và một cái gì đó giống như một "thông điệp chuyển đổi" vốn đã xấu. Mặt khác, như tôi đã chỉ ra trong câu trả lời của tôi, một cái gì đó như "gia tăng" thường là chính xác những gì bạn muốn, vì nó sẽ luôn luôn làm điều đúng trên máy chủ (so với "đặt thành 5" nếu bạn nghĩ rằng giá trị hiện tại là 4) – kyoryu

0

Trong suy nghĩ chung về lập trình mạng, tôi nghĩ bạn nên tìm hiểu về:
1. Ổ cắm (tất nhiên).
2. Ngã ba và luồng.
3. Quy trình khóa (sử dụng mutex hoặc semaphore hoặc các quy trình khác).

Hy vọng trợ giúp này ..

+0

Xin chào, cảm ơn nhưng không thực sự. Tất cả những thứ đó đều ổn. Tôi chỉ đang tìm một số hướng dẫn chung. Ví dụ sử dụng ACK vv – uriDium

+0

Thay vì tìm hiểu về luồng, tôi sẽ tìm hiểu về không chặn IO (nếu làm việc ở mức ổ cắm, đó là). – kyoryu

Các vấn đề liên quan