Về cơ bản, bạn có 3 lựa chọn tại thời điểm viết bài này:
WebSockets
WebSockets là một giao thức thông điệp nhẹ mà sử dụng giao thức TCP, chứ không phải là một việc thực hiện Javascript của TCP socket, như bạn' đã lưu ý. Tuy nhiên, ngoài sự bắt tay ban đầu, không có tiêu đề HTTP nào được chuyển đến và vượt qua điểm đó. Sau khi kết nối được thiết lập, dữ liệu sẽ tự do, với chi phí tối thiểu.
dài bỏ phiếu
dài bỏ phiếu, trong Tóm lại, liên quan đến việc bỏ phiếu khách hàng máy chủ để biết thông tin mới theo định kỳ với các yêu cầu HTTP. Điều này cực kỳ tốn kém về mặt CPU và băng thông, vì bạn đang gửi một tiêu đề HTTP mới cực nhanh mỗi lần. Về cơ bản, đây là lựa chọn duy nhất của bạn khi nói đến các trình duyệt cũ hơn và các thư viện như Socket.io sử dụng bỏ phiếu dài làm dự phòng trong những trường hợp này.
WebRTC của
Ngoài những gì đã được đề cập đã, WebRTC cho phép truyền thông qua UDP. UDP từ lâu đã được sử dụng trong các trò chơi nhiều người chơi trong môi trường không dựa trên web vì chi phí thấp của nó (tương đối so với TCP), độ trễ thấp và tính chất không chặn.
TCP "đảm bảo" rằng mỗi gói sẽ đến (tiết kiệm cho lỗi mạng nghiêm trọng) và chúng sẽ luôn đi theo thứ tự chúng được gửi. Điều này là rất tốt cho các thông tin quan trọng như đăng ký điểm số, số truy cập, trò chuyện, v.v.
UDP, mặt khác, không có sự bảo đảm như vậy. Các gói có thể đến theo bất kỳ thứ tự nào, hoặc hoàn toàn không. Điều này thực sự hữu ích khi nói đến dữ liệu ít quan trọng được gửi ở tần số cao và cần phải đến càng nhanh càng tốt, chẳng hạn như vị trí trình phát hoặc đầu vào. Lý do là các luồng TCP bị chặn nếu một gói duy nhất bị trì hoãn trong quá trình vận chuyển, dẫn đến những khoảng trống lớn trong bản cập nhật trạng thái trò chơi. Với UDP, bạn có thể đơn giản bỏ qua các gói đến trễ (hoặc không hề) và tiếp tục với gói tiếp theo bạn nhận được, tạo trải nghiệm mượt mà hơn cho người chơi. Tại thời điểm viết bài này, WebSockets có lẽ là lựa chọn tốt nhất của bạn, mặc dù việc chấp nhận WebRTC đang mở rộng nhanh chóng, và thực sự có thể thích hợp hơn khi bạn chơi xong trò chơi của mình, vì vậy đó là điều cần xem xét.
Thực tế mỗi lần truyền chỉ chứa hai byte trên cao. Việc bắt tay http chỉ xảy ra khi mở một websocket mới và bạn có thể giữ cho websocket mở miễn là trình duyệt vẫn nằm trên trang đó. –
Có, họ đang có. bắt tay HTTP được thực hiện một lần để mở socket. Vì vậy, chi phí rất lớn nếu bạn đóng socket sau một tin nhắn, và không đáng kể nếu bạn giữ ổ cắm mở mãi mãi. – Raynos
Tại sao quá trình bắt tay lại phức tạp như vậy? Từ những gì tôi nhớ lại, người ta phải đọc trong một số chuỗi, cuối cùng là một số ký tự [ngẫu nhiên?] Mà sau đó phải được mã hóa base64 theo một cách nào đó và gửi lại cho khách hàng. Tôi đã cố gắng viết mã bắt tay phía máy chủ cho mình, nhưng nó không hoạt động (quá trình bắt tay không bao giờ hoàn thành, vì vậy tôi không bao giờ có thể gửi và lấy các gói của riêng mình). Tôi đã đạt được kết quả chính xác tương tự khi sử dụng một gói Java mà người khác đã viết để làm điều tương tự. – Josh1billion