2011-09-28 61 views
7

Đối với một dự án trường học, chúng ta phải tạo trò chơi nhiều người chơi bằng Java (nó phải là máy khách/máy chủ) có thể được phát qua internet (chúng tôi đang lập trình ở trường học) nó không phải là bài tập về nhà). Trò chơi là theo lượt, nhưng phải có một cuộc trò chuyện, trong đó ofcourse là thời gian thực. Tuy nhiên, không ai trong chúng ta có kinh nghiệm với lập trình mạng và tôi càng đọc nhiều về nó, tôi càng có nhiều câu hỏi hơn.Trò chơi nhiều người chơi Java - khái niệm mạng

Suy nghĩ đầu tiên của tôi là sử dụng API socket để triển khai phần nhiều người chơi. Máy chủ đợi dữ liệu mới từ máy khách. Tuy nhiên, có nhiều loại dữ liệu để nhận, như tin nhắn trò chuyện, chuyển động, v.v. Ngoài ra, khi kết nối với máy chủ được thực hiện, một số dữ liệu ban đầu (như tên người chơi) sẽ được gửi đi. Máy chủ sẽ có thể xem loại tin nhắn nào nhận được, nhưng làm cách nào? Tôi đã nghĩ đến việc tạo ra một lớp Message với một trường chuỗi type. Nhưng trong mã máy chủ của tôi, tôi sẽ nhận được mã như thế này:

Khi có rất nhiều loại khác nhau của dữ liệu để gửi (và There Will Be), điều này không giống như cách hiệu quả nhất. Ngoài ra, điều này có nghĩa là cả máy chủ và máy khách nên có thông báo này lớp/giao diện (mã trùng lặp).

Còn trò chơi khác thì sao? Ví dụ: người chơi 1 di chuyển nhân vật của mình đến một vị trí đánh bại một nhân vật khác. Khách hàng của người chơi 1 tính toán sự thất bại này và áp dụng các hành động chính xác. Nhưng những gì nên được gửi đến máy chủ? Chỉ là vị trí người chơi mới hoặc cũng là thất bại? Với tùy chọn đầu tiên, nó có nghĩa là tất cả các khách hàng khác nên thực hiện các phép tính. Điều này có gây ra rắc rối không? Vì tôi không có kinh nghiệm lập trình mạng trước, tôi hơi bối rối về cách làm tất cả những điều này.

Tôi cũng đã đọc một chủ đề khác ở đây trên Stackoverflow rằng RMI có thể là một lựa chọn tốt hơn. Sau khi đọc một số thông tin về điều này, tôi hiểu RMI là gì, nhưng tôi vẫn không thể xem liệu nó có phải là một lựa chọn tốt cho dự án này hay không. Bất kỳ lời khuyên cho điều này?

Như bạn thấy, tôi hơi bối rối về cách bắt đầu với phần mạng của dự án này. Tôi đã tìm kiếm một số cuốn sách lập trình trò chơi (cho Java ofcourse), nhưng không ai trong số họ được tập trung vào phần mạng. Tôi cũng đã tìm kiếm các cuốn sách kết nối mạng Java, nhưng chúng dường như tập trung vào công nghệ, chứ không tập trung vào các quy tắc mã tốt.

Nếu bất kỳ ai biết một cuốn sách hay hoặc có một số lời khuyên trong đúng hướng, nó sẽ được đánh giá cao.

Cảm ơn

+7

"... lập trình này ở trường, vì vậy nó không phải là bài tập về nhà" . Cổ điển. – CPerkins

+0

Ít nhất anh ta không muốn mã. –

+0

@CPerkins: Chúng tôi phải làm việc cho dự án này ở trường, vâng. Tôi không yêu cầu bất cứ ai làm công việc của tôi, chỉ cần hỏi ý kiến ​​về cách thực hiện điều này. – Bv202

Trả lời

7

Bạn đang đi đúng hướng, nhưng có một vài điều cần làm rõ.

Nếu bạn đang sử dụng ổ cắm, bạn đã tìm ra rằng bạn cần phải xác định một giao thức - một ngôn ngữ chung cho các giao tiếp di chuyển và trạng thái của trò chơi. Ổ cắm sẽ cho phép bạn gửi bất kỳ loại dữ liệu nào ở bất kỳ định dạng nào bạn muốn. Có vẻ như bạn đang suy nghĩ về việc sắp xếp một lớp Tin nhắn để gửi loại này, đây là một trong những việc làm. Nếu bạn sử dụng RMI (có giao thức riêng của nó), bạn sẽ hành động như thể bạn đang gọi các phương thức Java, nhưng thực chất bạn đang làm một cái gì đó tương tự, tuần tự hóa dữ liệu và truyền nó qua một socket.

Không có gì hoàn toàn sai về việc chia sẻ mã giữa máy khách và máy chủ - trên thực tế, hầu hết các dịch vụ thực hiện điều này dưới một dạng nào đó. Máy khách và máy chủ của bạn đều có thể sử dụng một thư viện chung để xác định các lớp thông báo được truyền đi xung quanh. RMI sử dụng các phương thức để xác định giao diện. Các dịch vụ Web của tất cả các loại xác định cách thức các phương thức được gọi. Ý tưởng chung là chỉ phơi bày giao diện chứ không phải triển khai.

Về mã của bạn, nó có thể sạch hơn để có một lớp con Tin nhắn khác nhau cho từng loại thông báo và bạn có thể đặt các thông số bổ sung cho mỗi tin nhắn. Sau đó bạn có thể có một lớp MessageProcessor như:

class MessageProcessor{ 
    void process(Move1Message m) {...} 
    void process(Move2Message m) {...} 
    .... 

} 

Về những gì để gửi - nguyên tắc chung nên mà khách hàng có trách nhiệm gửi di chuyển họ đến máy chủ, bất cứ thứ gì nó làm là một phần thưởng, vì máy chủ cần phải xác minh tính hợp pháp của việc di chuyển. Máy chủ phải luôn là yếu tố quyết định trạng thái của trò chơi để tránh gian lận và triển khai thực hiện sai của khách hàng

Trừ khi bạn muốn tìm hiểu cách triển khai giao thức của riêng mình hoặc sử dụng thư viện ổ cắm Java, sẽ dễ dàng hơn sử dụng RMI. Bạn cũng có thể sử dụng SOAP, REST hoặc bất kỳ giao thức nào khác, nhưng tôi sẽ không bận tâm suy nghĩ quá nhiều về việc sử dụng cái nào vào lúc này. Tôi không có bất kỳ đề xuất nào vượt quá the RMI documentation, mặc dù tôi nghĩ rằng this book có rất nhiều ví dụ về mã để kết nối mạng.

0

khi đi với ổ cắm mỗi khách hàng sẽ có nó là kết nối riêng trên đó a thread máy chủ sẽ chờ đợi (đừng quên để tuôn ra những dòng về phía khách hàng hoặc bạn sẽ chờ đợi mãi mãi)

mỗi dòng sẽ là một thông điệp riêng biệt và để phân biệt các loại tin nhắn, bạn có thể sử dụng "tiêu đề" ở đầu mỗi tin nhắn (một chuỗi gồm 3 ký tự ở đầu) nói msg, mov, lgn và sử dụng lựa chọn giống như trie. cái nào bạn nhận được


wh vi bằng cách sử dụng RMI, bạn có thể giữ máy chủ giữ đối tượng người quản lý (xuất và đăng ký trong sổ đăng ký) mà khách hàng có thể yêu cầu kết nối "-object" sẽ giống như kết nối trong việc thực hiện socket nhưng bạn sẽ có thể để có một phương pháp cho mỗi điều bạn muốn làm mặc dù các callbacks sẽ cần phải được thực hiện theo cách khác (với ổ cắm bạn có kết nối sẵn sàng cho nó)

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