2013-06-18 23 views
5

Tôi đang cố gắng gửi một gói đóng gói cho khách hàng của tôi từ máy chủ của tôi giả tạo, tôi nên gửi giá trị thô nào để khách hàng hiểu rằng tôi đang đóng kết nối? Nó có khác nhau giữa các giao thức websocket không?WebSocket Đóng gói

+0

khách hàng của bạn =? – dtb

+0

Đây có phải là câu hỏi giống như http://stackoverflow.com/questions/17175016/alchemy-forcefully-disconnect-client – Amy

+0

http://msdn.microsoft.com/en-us/library/system.net.websockets.websocket .closeasync.aspx có vẻ phù hợp. Vui lòng cho biết những gì bạn đã thử và những gì không hiệu quả với bạn. –

Trả lời

7

Ở mức đơn giản nhất - chỉ cần đóng kết nối - điều đó sẽ hoạt động tốt.

Rất sớm hixie-76 có một chuỗi đơn giản để đóng báo hiệu: chỉ cần gửi hai byte 0xFF, 0x00 (đầu tiên là loại khung, thứ hai là độ dài).

Trong tất cả các thông số kỹ thuật sau, khung hình phức tạp hơn một chút; họ được chia nhỏ như:

  • (1 byte) cờ và opcode
  • (số biến byte) mặt nạ lá cờ và payload length
  • (không bắt buộc, 4 byte) mặt nạ
  • ({chiều dài} bytes) payload

Đối với phần đầu tiên, opcode chúng tôi muốn là 0x08, và điều này phải được kết hợp với cờ "vây", 0x80 (điều này chỉ cho biết khung không được chia thành nhiều thư) 0x88.

Đối với phần thứ hai, chúng ta có thể sử dụng thông điệp có độ dài bằng 0 nhưng chúng ta cần biết liệu chúng ta là máy khách đến máy chủ (luôn che dấu, vì vậy chúng ta cần sử dụng 0x80) hoặc máy chủ đến máy khách (không bao giờ đeo mặt nạ, vì vậy chúng tôi cần sử dụng 0x00).

Phần thứ ba là chỉ được bao gồm nếu cờ mặt nạ được đặt, vì vậy từ máy khách đến máy chủ; vì chúng tôi không gửi tải trọng nên không có điểm nào phát minh ra mặt nạ mã hóa an toàn - chúng tôi chỉ có thể sử dụng 0x00 0x00 0x00 0x00.

Thứ tư bị bỏ qua vì chúng tôi ghi rõ độ dài bằng không.

Vì vậy: client-to-server: 0x88 0x80 0x00 0x00 0x00 0x00

Và server-to-client: 0x88 0x00

+0

Tôi có quyền truy cập vào lớp giao thức thô, hiện tại tôi đang sử dụng 'process.context.Send (new byte [4] {80,01,00,00}, true, true); 'và nó có vẻ hoạt động hoàn hảo ngoại trừ việc tôi nhận được kết nối' WebSocket tới 'ws: // localhost: 8000 /' không thành công: bit nén phải là 0 nếu không có lỗi 'mở rộng khung mở rộng được thương lượng'. – user2498443

+0

@user Tôi đồng ý với điều đó; bạn đã nhận được giá trị 80 từ đâu? Đó là rsv1 và rsv3 set, opcode zero. Bạn cần phải gửi mã số 8 với bộ bit vây - số thập phân 136? (Xong trong đầu của tôi - Tôi chưa kiểm tra giá trị đó) –

+1

Tôi xin lỗi vì nó khác nhau giữa các giao thức? Tôi không truy cập vào các kết nối, tôi sử dụng Alchemy trong C# và stupidly họ không có một phương pháp để chấm dứt một kết nối. Cảm ơn tất cả những người giúp đỡ! :) – user2498443