2010-03-15 44 views
32

Đây là một câu hỏi chung. Tôi không tìm kiếm câu trả lời hay nhất, tôi chỉ muốn bạn thể hiện các phương pháp yêu thích của mình.Làm cách nào để triển khai giao thức mạng?

Tôi muốn thực hiện một giao thức mạng trong Java (nhưng đây là một câu hỏi khá chung chung, tôi phải đối mặt với cùng một vấn đề trong C++), đây không phải là lần đầu tiên, như tôi đã làm điều này trước đây. Nhưng tôi nghĩ rằng tôi đang thiếu một cách tốt để thực hiện nó. Trong thực tế thường là tất cả về trao đổi tin nhắn văn bản và một số byte đệm giữa các máy chủ, lưu trữ trạng thái và chờ cho đến khi thông báo tiếp theo đến. Vấn đề là tôi thường kết thúc với một loạt các chuyển đổi và phức tạp hơn hoặc ít hơn nếu các câu lệnh phản ứng với các trạng thái/thông điệp khác nhau. Toàn bộ sự việc thường phức tạp và khó khăn. Chưa kể rằng đôi khi những gì xảy ra có một số "điểm mù", tôi có nghĩa là các trạng thái của giao thức không được bảo hiểm và hành xử theo một cách không thể đoán trước. Tôi đã cố gắng viết ra một số lớp máy trạng thái, kiểm tra trạng thái bắt đầu và kết thúc cho mỗi hành động theo cách thông minh hoặc ít hơn. Điều này làm cho việc lập trình giao thức rất phức tạp vì tôi phải viết các dòng và các dòng mã để bao quát mọi tình huống có thể xảy ra. Những gì tôi muốn là một cái gì đó giống như một mô hình tốt, hoặc một thực hành tốt nhất được sử dụng trong lập trình các giao thức phức tạp, dễ dàng để mantain và mở rộng và rất dễ đọc.

Đề xuất của bạn là gì?

Trả lời

15

Đọc trên Tiểu bang mẫu thiết kế để tìm hiểu cách tránh nhiều báo cáo chuyển đổi.


"đôi khi những gì đi ra có một số 'điểm mù', tôi có nghĩa là trạng thái của giao thức chưa được bao phủ ..."

Nhà nước có thể giúp tránh những khoảng trống. Nó không thể đảm bảo một thiết kế tốt, bạn vẫn phải làm điều đó.

"... vì tôi phải viết dòng và dòng mã để bao trả mọi tình huống có thể có."

Điều này không nên được coi là gánh nặng hoặc vấn đề: Bạn phải viết các dòng mã để bao gồm mọi tình huống có thể xảy ra.

Tiểu bang có thể giúp vì bạn có thể tận dụng thừa kế. Nó không thể đảm bảo một thiết kế tốt, bạn vẫn phải làm điều đó.

+0

Trong sách "Mô hình Desing" (http://en.wikipedia.org/wiki/Design_Patterns) mẫu này được áp dụng cho vấn đề liên quan. – Dmitry

+0

Tôi đã có một cái nhìn trên wikipedia và có vẻ rất thông minh và nó sẽ giải quyết nhiều vấn đề tôi có. Tôi nên mua cuốn sách Design Patterns chết tiệt đó ... :) – gotch4

+0

@ gotch4 - Duyệt qua một hiệu sách tốt. GOF là một trong những mặt hàng mà bạn cho là để chuyển sang công chúng nhưng sự thật là có những cuốn sách mẫu tốt hơn hiện nay. Hầu hết sẽ bao gồm các mô hình nhà nước để cửa hàng xung quanh cho một trong những bạn cảm thấy thoải mái với. – Duck

1

Nếu bạn đang sử dụng Java, hãy cân nhắc xem Apache MINA, tài liệu và mẫu của nó sẽ truyền cảm hứng cho bạn theo đúng cách.

6

Thiết kế giao thức thường là tất cả về không gian ứng dụng mà bạn đang làm việc bên trong. Ví dụ, http là tất cả về xử lý các trang web, đồ họa và bài viết, trong khi FTP là tất cả về việc chuyển các tập tin.

Vì vậy, trong ngắn hạn, để bắt đầu, bạn nên quyết định không gian ứng dụng nào bạn đang ở, sau đó xác định các hành động cần được thực hiện. Cuối cùng, trước khi bạn bắt đầu thiết kế giao thức thực tế của mình, bạn nên nghiêm túc tìm kiếm một giao thức khác để thực hiện những gì bạn muốn làm và tránh thực hiện một giao thức chồng lên nhau. Chỉ sau khi bạn đã xác định rằng một cái gì đó khác được xây dựng trước hoàn toàn sẽ không làm việc cho bạn, bạn nên bắt đầu xây dựng ngăn xếp giao thức của riêng bạn.

3

hữu hạn máy nhà nước là những gì bạn muốn

FSM

Vì vậy, bạn định nghĩa một bó toàn bộ của các quốc gia mà bạn có thể ở như là một nhận hoặc người gửi (nhàn rỗi, connecting_phase1, connecting_phase2, gói dự kiến, .. .)

Sau đó, xác định tất cả các sự kiện có thể (packet1 đến, đóng cửa net, ...)

cuối cùng bạn có một bảng nói rằng 'khi ở trạng thái x và sự kiện xảy ra n làm func y và chuyển sang trạng thái q '- cho mỗi tiểu bang và sự kiện (nhiều người sẽ được null hoặc dups)

Edit - làm thế nào để làm cho một FSM (phác thảo thô)

struct FSMNode 
{ 
     int m_nextState; 
     void (m_func*); 
} 
FSMNode states[NUMSTATES][NUMEVENTS]= 
    { // state 0 
     {3, bang}, // event 0 
     {2,wiz}, 
     {1, fertang} 
    } 
    { 
     {1, noop}, // event 0 
     {1, noop}, 
     {3, ole} 
    } 
    ....... 
    FSMNode node = states[mystate][event]; 
    node.m_func(context); 
    mystate = node.m_nextState; 

Tôi chắc chắn đây là đầy đủ các cú pháp không hợp lệ - nhưng tôi hy vọng bạn nhận được sự trôi dạt

+0

tất nhiên tôi biết điều này. Những gì tôi muốn biết là thực hành tốt nhất để thực hiện FSM và bảng ... đó là câu hỏi thực sự của tôi – gotch4

2

Tại sao không sử dụng XML làm giao thức của bạn? Bạn có thể đóng gói và phân loại tất cả các mẩu dữ liệu của bạn bên trong các nút XML

+0

Đó không phải là vấn đề ... Tôi biết tôi triển khai codec ... – gotch4

+0

Tôi đã đề xuất nó vì định dạng mở được sử dụng rộng rãi trên Internet ngày nay. Tôi không nói bạn không phải bây giờ làm thế nào để thực hiện codec. Tôi chỉ cố gắng tiết kiệm thời gian, vì nó đã xảy ra với tôi trong các dự án thế giới thực, nơi tôi đã chọn định dạng giao thức này. – Andres

+0

Trong thực tế, đây là lựa chọn thông thường của tôi ... nhưng mối quan tâm của tôi không phải là về định dạng dữ liệu, là nhiều hơn về tình trạng giao thức và thực hiện. – gotch4

2

Không thể tự mình làm ví dụ, nhưng làm cách nào để xem những người khác (có thẩm quyền) đang làm như thế nào?

Như cái này? http://anonsvn.jboss.org/repos/netty/trunk/src/main/java/org/jboss/netty/handler/codec/http/

P.S. cho rằng vấn đề, tôi thực sự khuyên bạn nên sử dụng netty như khuôn khổ mạng của bạn và xây dựng giao thức của bạn trên đầu trang của nó. Nó sẽ rất dễ dàng, và bạn có thể sẽ loại bỏ các cơn đau đầu ...

+0

Liên kết bị hỏng. – Piovezan

3

Trong C++ bạn có thể sử dụng thư viện Boost :: Spirit để phân tích cú pháp thông điệp giao thức của bạn dễ dàng. "Khó khăn" duy nhất là xác định ngữ pháp của giao thức tin nhắn của bạn. Hãy xem mã nguồn Gnutella để xem cách họ giải quyết vấn đề này. Ở đây http://www9.limewire.com/developer/gnutella_protocol_0.4.pdf là thông số giao thức Gnutella

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