Khi một thiết bị đầu cuối đã cả gửi và nhận một khung kiểm soát Đóng, thiết bị đầu cuối mà NÊN Đóng WebSocket kết nối theo quy định tại Mục 7.1.1. (RFC 6455 7.1.2)
Các dụ SRWebSocket không _disconnect
đây vì đó sẽ đóng kết nối TCP đến máy chủ trước khách hàng đã nhận được một khung kiểm soát Đóng trong phản ứng. Trong thực tế, _disconnect
ing ở đây sẽ xé xuống ổ cắm TCP trước khi khách hàng thậm chí có thể gửi khung Đóng của riêng nó đến máy chủ, bởi vì _disconnect
cuối cùng gọi _pumpWriting
trước khi closeWithCode:
có thể. Máy chủ có thể sẽ đáp ứng đủ một cách duyên dáng, nhưng nó không phù hợp và bạn sẽ không thể gửi mã đóng duy nhất cho tình huống trong khi mọi thứ được thiết lập theo cách này.
này được xử lý đúng cách trong handleCloseWithData:
if (self.readyState == SR_OPEN) {
[self closeWithCode:1000 reason:nil];
}
dispatch_async(_workQueue, ^{
[self _disconnect];
});
khối này xử lý Đóng yêu cầu khởi xướng bởi cả hai máy khách và máy chủ. Nếu máy chủ gửi khung Đóng đầu tiên, phương thức chạy theo chuỗi bạn đã đặt, cuối cùng kết thúc bằng _pumpWriting
qua closeWithCode:
, nơi khách hàng sẽ phản hồi với khung Đóng của riêng nó. Sau đó nó tiếp tục phá bỏ kết nối với số _disconnect
.
Khi khách hàng gửi frame trước, closeWithCode:
chạy một lần mà không đóng kết nối TCP vì _closeWhenFinishedWriting
vẫn là sai. Điều này cho phép thời gian máy chủ để đáp ứng với khung Đóng riêng của mình, mà thông thường sẽ cho kết quả trong việc điều hành closeWithCode:
một lần nữa, nhưng đối với các khối sau ở phía trên cùng của phương pháp đó:
if (self.readyState == SR_CLOSING || self.readyState == SR_CLOSED) {
return;
}
Vì readyState được thay đổi trên phiên đầu tiên của closeWithCode:
, lần này nó sẽ không chạy.
Sửa lỗi của emp là cần thiết để thực hiện công việc này như dự định, tuy nhiên: nếu không khung Đóng từ máy chủ không làm gì cả. Kết nối sẽ vẫn kết thúc, nhưng bẩn, bởi vì máy chủ (có cả gửi và nhận khung của nó) sẽ phá vỡ ổ cắm ở cuối của nó và máy khách sẽ phản hồi với NSStreamEventEndEncountered:
, thường được dành riêng cho các lỗi luồng gây ra bởi tổn thất đột ngột kết nối. Một cách tiếp cận tốt hơn là xác định lý do khung không bao giờ bị loại ra khỏi số _innerPumpScanner
đến handleCloseWIthData:
. Một vấn đề khác cần lưu ý là theo mặc định, close
chỉ cần gọi số closeWithCode:
với mã RFC không tương thích -1. Điều này đã ném lỗi trên máy chủ của tôi cho đến khi tôi thay đổi nó để gửi một trong các giá trị được chấp nhận.
Tất cả những gì đã nói: phương thức đại biểu của bạn không hoạt động vì bạn đang hủy ủy quyền ngay sau khi bạn gọi close
. Mọi thứ trong close
nằm bên trong một khối không đồng bộ; sẽ không có người được ủy quyền để gọi vào lúc bạn gọi didCloseWithCode:
bất kể bạn làm gì khác ở đây.
điều kiện này trả về "if (! Self.webSocket)" là gì? –
có nghĩa là websocket sẽ không được đóng nếu nó là 0, vì nó không mở anyways –
Tôi luôn gặp lỗi này và Test to Speech bị ngắt âm thanh, WebSocket đóng với lý do [1000]: Ngắt kết nối thủ công kết nối Bất kỳ đề xuất? –