Những gì liên quan đến việc viết một máy chủ sảnh?


8

Vì vậy, tôi đang viết một hệ thống mai mối Tướng dựa trên chế độ xem Sảnh với các phòng chơi trò chơi, trò chuyện chung, v.v ... Cho đến nay tôi có một nguyên mẫu hoạt động nhưng tôi nghi ngờ lớn về một số điều tôi đã làm với máy chủ. Viết một máy chủ sảnh chơi game là một trải nghiệm lập trình mới đối với tôi và vì vậy tôi không có một mô hình lập trình rõ ràng cũng như chính xác cho nó. Tôi cũng không thể tìm thấy một bài báo mô tả nó nên hoạt động như thế nào. Tôi đã đặt hàng "Lập trình mạng Java phiên bản thứ 3" từ Amazon và vẫn đang chờ giao hàng, hy vọng tôi sẽ tìm thấy một số ví dụ / thông tin hữu ích trong cuốn sách này.

Trong khi đó, tôi muốn thu thập ý kiến ​​của bạn và xem bạn sẽ xử lý một số việc như thế nào để tôi có thể học cách viết một máy chủ chính xác. Dưới đây là một vài câu hỏi ngoài đầu tôi: (có thể nhiều hơn sẽ đến)

Đầu tiên, hãy xác định những gì một máy chủ làm. Chức năng chính của nó là giữ các kết nối TCP với khách hàng, lắng nghe các sự kiện họ tạo và gửi chúng cho những người chơi khác. Nhưng có nhiều hơn thế không?

Tôi có nên sử dụng một chủ đề cho mỗi khách hàng? Nếu vậy, 300 khách hàng = 300 chủ đề. Có quá nhiều không? Phần cứng nào là cần thiết để hỗ trợ điều đó? Và một sảnh tiêu thụ bao nhiêu băng thông?

Loại cấu trúc dữ liệu nào nên được sử dụng để giữ ổ cắm của khách hàng? Làm thế nào để bạn bảo vệ nó khỏi sửa đổi đồng thời (ví dụ: một người chơi vào hoặc tồn tại tiền sảnh) khi lặp qua nó để gửi một sự kiện mà không làm tổn thương thông lượng? Có phải ConcảnHashMap là câu trả lời chính xác ở đây, hoặc có một số kỹ thuật tôi nên biết?

Khi một người dùng vào sảnh, bạn sẽ sử dụng cơ chế nào để chuyển trạng thái của sảnh cho anh ta? Và trong khi điều này đang xảy ra, các sự kiện khác sẽ nổi lên ở đâu?


300 luồng là ổn trên một hệ điều hành hiện đại, ở mức hơn 1000 bạn có thể muốn kiểm tra các hệ thống khác như hệ thống không được kết nối.
Valmond

Câu trả lời:


3

Mô hình mọi thứ như các đối tượng. Bạn có các phòng chat, phiên trò chơi, người chơi ... Đừng sinh ra chủ đề mới cho người chơi mới. Thay vào đó, hãy thử xem mỗi lớp là một máy trạng thái: Một người chơi có thể được kết nối hoặc ngắt kết nối, anh ta có TcpConnection và một biến chỉ định thời gian anh ta còn lại để di chuyển (ví dụ như một ví dụ).

Sau đó, khi bạn có tất cả các đối tượng của mình trong một mảng hoặc một cái gì đó tương tự, bạn lặp đi lặp lại trên đó cứ sau 10 mili giây (số này là một ví dụ quá rõ ràng) và thực hiện các hành động thích hợp.

Ví dụ: chấm dứt phiên trò chơi nếu một trong những người chơi rời khỏi trò chơi, gửi di chuyển từ người chơi này sang người chơi khác ...

Đối với tất cả các sự kiện xảy ra trong trò chơi, bạn sẽ phải gửi tin nhắn qua mạng. Tạo thêm một lớp / bảng liệt kê chứa các loại thông báo khác nhau. Nếu một người chơi thực hiện di chuyển, bạn có thể gửi nó tới máy chủ "di chuyển d4 đến d5" hoặc một cái gì đó. Nếu bạn chỉ làm một trò chơi cờ vua, bạn có thể gửi các chuỗi qua mạng. Đối với bất cứ điều gì phức tạp hơn, tôi sẽ đề nghị bạn chỉ gửi một byte.

Thông thường các gói trò chơi bao gồm: độ dài của gói, loại thông báo / loại sự kiện gói (di chuyển, người chơi tham gia, người chơi bên trái, ...) và nội dung (nếu người chơi tham gia, nội dung sẽ là tên cho thí dụ)


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.