2016-01-26 18 views
8

Tôi đã kết nối Websocket với máy chủ trong vòng 40 giây hoặc lâu hơn. Lý tưởng nhất là nó sẽ được mở vĩnh viễn.Cách chính xác để xử lý Websocket

Máy khách liên tục gửi dữ liệu đến máy chủ và ngược lại.

Ngay bây giờ tôi đang sử dụng trình tự này:

var socket; 
function senddata(data) 
{ 

    if (!socket) 
    { 
     socket = new WebSocket(url); 
     socket.onopen = function (evt) { 

      socket.send(data); 

      socket.onmessage = function (evt) { 
       var obj = JSON.parse(evt.data); 

       port.postMessage(obj); 
      } 

      socket.oneerror = function (evt) { 
       socket.close(); 
       socket = null; 
      } 
      socket.onclose = function(evt){ 
       socket = null; 
      } 


     } 
    } 
    else 
    { 
     socket.send(data); 
    } 

} 

Rõ ràng theo logic hiện tại, trong trường hợp lỗi, dữ liệu yêu cầu hiện tại có thể không được gửi ở tất cả.

Để thẳng thắn đôi khi nó cho lỗi rằng websocket vẫn đang ở trạng thái kết nối. Kết nối này thường xuyên bị hỏng do sự cố mạng. Trong ngắn hạn nó không hoạt động hoàn hảo.

Tôi đã đọc thiết kế tốt hơn: How to wait for a WebSocket's readyState to change nhưng không bao gồm tất cả các trường hợp tôi cần xử lý.

Ngoài ra tôi đã Google tìm hiểu về điều này nhưng không thể có được quy trình chính xác cho việc này.

Vì vậy, cách nào đúng để gửi dữ liệu thông thường thông qua Websockets xử lý tốt các vấn đề này như ngắt kết nối, v.v ...?

Trả lời

2

Một sự kiện bạn dường như không bao gồm được đóng. Mà nên làm việc thực sự tốt, vì nó được gọi là bất cứ khi nào kết nối chấm dứt. Điều này đáng tin cậy hơn so với onerror, bởi vì không phải tất cả các gián đoạn kết nối đều dẫn đến lỗi.

+0

Cảm ơn tôi đã thêm nó. – user5858

1

Cá nhân tôi sử dụng Socket.IO, nó cho phép liên lạc theo thời gian thực hai chiều giữa khách hàng và máy chủ.

Đó là sự kiện được thúc đẩy. Các sự kiện như

on connection :: socket.on('conection',callback);

on disconnect :: socket.on('disconnect',callback);

được xây dựng với socket.io để nó có thể giúp bạn với mối quan tâm kết nối của bạn. Khá nhiều rất dễ sử dụng, hãy kiểm tra trang web của họ nếu bạn quan tâm.

1

tôi sử dụng sơ đồ hai lớp trên client: trừu tượng-wrapper + WebSocket-client:

Trách nhiệm của WebSocket-client đang tương tác với một máy chủ, khôi phục kết nối và cung cấp các giao diện (event-emitter và một số phương thức) cho trình bao bọc trừu tượng.

Các trừu tượng-wrapper là một lớp cao cấp, trong đó tương tác với WebSocket-client, đăng ký vào các sự kiện của nó và dữ liệu tập hợp, khi kết nối chỉ là tạm thời thất bại. wrapper trừu tượng có thể cung cấp cho lớp ứng dụng bất kỳ giao diện nào như Promise, EventEmitter và vân vân.

Trên lớp ứng dụng, tôi chỉ làm việc với trình bao bọc trừu tượng và không lo lắng về kết nối hoặc mất dữ liệu. Chắc chắn, bạn nên có thông tin ở đây về trạng thái kết nối và xác nhận gửi dữ liệu, vì nó hữu ích.

Nếu nó là cần thiết, tôi có thể cung cấp một số mã ví dụ

0

Đây rõ ràng là một vấn đề máy chủ không phải là một vấn đề trong các khách hàng.

Tôi không biết máy chủ trông như thế nào ở đây. Nhưng đây là một vấn đề lớn đối với tôi trong quá khứ khi tôi đang làm việc trên một dự án dựa trên websocket. Kết nối sẽ liên tục phá vỡ.

Vì vậy, tôi đã tạo một máy chủ websocket trong java và giải quyết được sự cố của tôi.

ổ cắm web phụ thuộc vào nhiều cài đặt, như nếu bạn đang sử dụng servlet thì cài đặt của thùng chứa servlet quan trọng, nếu bạn đang sử dụng một số cài đặt php, apache và php, ví dụ: nếu bạn tạo máy chủ websocket trong php và php có thời gian chờ mặc định là 30 giây, nó sẽ bị gián đoạn sau 30 giây. Nếu giữ-sống không được thiết lập, kết nối sẽ không sống sót, vv

gì bạn có thể làm giải pháp như nhanh chóng là

  1. giữ gửi ping đến một máy chủ sau một khoảng thời gian nhất định (như 2 hoặc 3 giây, vì vậy nếu một websocket bị ngắt kết nối nó được biết đến với khách hàng để nó có thể gọi onclose hoặc ondisconnect, tôi hy vọng bạn biết rằng không có cách nào để tìm ra nếu một kết nối bị hỏng khác hơn là không gửi một cái gì đó. tiêu đề tiếp tục của máy chủ
  2. Nếu bạn có quyền truy cập vào máy chủ, thì đó là thời gian chờ của máy chủ, v.v.

Tôi nghĩ điều đó sẽ giúp

+0

Tôi chỉ nói về điều khách hàng – user5858

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