2013-08-08 40 views
30

Làm cách nào để đóng kết nối ổ cắm ở phía máy khách?Node.js: socket.io đóng kết nối máy khách

Tôi đang sử dụng:

  • socket.io 0,9
  • Node.js 0.10.15
  • bày tỏ 3.3.4

ví dụ: gọi localhost/test
- máy chủ bên

var test = io 
.of('/test') 
.on('connection', function (socket) { 

    console.log('open socket: ' + socket); 

    socket.on('disconnect', function() { 
    console.log('disconnected event'); 
    //socket.manager.onClientDisconnect(socket.id); --> endless loop with this disconnect event on server side 
    //socket.disconnect(); --> same here 
    }); 
}); 

- phía khách hàng

var socket = io.connect('http://localhost:3000/test'); 
socket.on('disconnect', function() { 
    console.log('disconnect client event....'); 
}); 

socket.emit('getInitData', function (data) { 
    .. do something with data 
}); 

Nếu tôi tải thử nghiệm trang Tôi cần một số giá trị từ máy chủ (getInitData).
Trong lần truy cập trang đầu tiên, tôi nhận được dữ liệu một lần, khi tải lại hoặc lần truy cập thứ hai, tôi nhận được dữ liệu đó gấp hai lần.

Kết nối ở phía máy chủ được tự động đóng lại khi tải lại trang và nếu bạn rời khỏi trang.
Nhưng ở phía máy khách, kết nối vẫn mở.
Làm cách nào để đóng kết nối ở phía máy khách hoặc kiểm tra xem đã có kết nối mở chưa?

CẬP NHẬT
tôi đã cố gắng hiện nay như sau: (phía khách hàng)

window.onbeforeunload = function(e) { 
    socket.disconnect(); 
}; 

này gây ra trên các mặt hàng trường hợp ngắt kết nối, nhưng tôi vẫn nhận được câu trả lời tripple hai lần hoặc. bạn

+0

Làm thế nào để bạn xử lý 'getInitData' sự kiện? –

+0

'getInitData' trả về một số giá trị từ nút addon bằng văn bản của riêng tôi. các giá trị đó được đặt trong một biểu mẫu (hộp kiểm, trường văn bản, v.v.) nhưng tôi chỉ phát hiện ra rằng kết nối trên máy chủ được khởi động nhiều lần. Mỗi khi tôi tải lại trang, một kết nối mới được thêm ngay cả khi kết nối đang được đóng lại. – baam

+1

Không có thứ gì như kết nối ở phía máy chủ và phía trình duyệt. Chỉ có một kết nối. Nếu một trong các bên đóng nó, thì nó sẽ đóng lại (và bạn không thể đẩy dữ liệu đến một kết nối được đóng rõ ràng). Bây giờ trình duyệt đóng kết nối khi bạn rời khỏi trang (nó không phụ thuộc vào thư viện bạn đang sử dụng), điều này ít nhất là đúng đối với WebSockets. Nếu một vấn đề như thế này xảy ra, sau đó tôi khá chắc chắn rằng có một lỗi trong mã của riêng bạn (ở phía máy chủ). Có thể bạn đang xếp chồng một số trình xử lý sự kiện nơi bạn không nên. – freakish

Trả lời

7

Không có điều gì như kết nối ở phía máy chủ và/hoặc bên trình duyệt. Chỉ có một kết nối. Nếu một trong các bên đóng nó, thì nó sẽ đóng lại (và bạn không thể đẩy dữ liệu đến một kết nối được đóng rõ ràng).

Bây giờ trình duyệt đóng kết nối khi bạn rời khỏi trang (nó không phụ thuộc vào thư viện/ngôn ngữ/hệ điều hành bạn đang sử dụng ở phía máy chủ). Điều này ít nhất là đúng đối với WebSockets (nó có thể không đúng đối với việc bỏ phiếu dài vì keep-alive nhưng hy vọng socket.io xử lý chính xác điều này).

Nếu một vấn đề như thế này xảy ra, thì tôi khá chắc chắn rằng có một lỗi trong mã của riêng bạn (ở phía máy chủ). Có thể bạn đang xếp chồng một số trình xử lý sự kiện nơi bạn không nên.

+7

*" Nếu một trong hai bên đóng nó, sau đó nó được đóng lại "* - làm thế nào để đóng nó programatically từ mỗi bên ..?Tôi không thể tìm thấy bất kỳ tài liệu nào –

57

đã thử:

socket.disconnect() 

về khách hàng?

+0

Không, tôi đã không. Tôi nghĩ rằng sẽ chỉ kích hoạt sự kiện ngắt kết nối ở phía máy chủ? Và khi nào tôi kích hoạt điều này? – baam

+0

Tôi nhớ điều đó trong câu hỏi của bạn, nhưng khi nào bạn muốn đóng kết nối trên máy khách? –

+0

Mỗi khi kết nối máy chủ bị đóng. (tải lại/làm mới và tải trang/thoát) – baam

1

Tôi đang cố gắng để đóng kết nối người sử dụng trong phiên bản 1.0 và thấy phương pháp này:

socket.conn.close() 

Sự khác biệt giữa phương pháp này và ngắt kết nối() là khách hàng sẽ tiếp tục cố gắng để kết nối lại với máy chủ.

0

thử này để đóng kết nối:

socket.close(); 

và nếu bạn muốn mở nó một lần nữa:

socket.connect(); 
5
socket.disconnect() 

Chỉ khởi động lại sự kiện ngắt kết nối bắn về phía khách hàng. Nhưng được kết nối lại.

socket.close() 

Ngắt kết nối khỏi máy khách. Khách hàng sẽ tiếp tục cố gắng kết nối.

0

Chỉ cần thử socket.disconnect(true) ở phía máy chủ bằng cách phát ra bất kỳ sự kiện nào từ phía máy khách.

+0

arg thật sự phải làm gì? – netpoetica

13

Đối socket.io phiên bản 1.4.5:

Mở server:

socket.on('end', function(){ 
    socket.disconnect(0); 
}); 

On khách hàng:

var io = io(); 
io.emit('end'); 
+0

Xin chào. Nó hoạt động, cảm ơn. Nhưng liệu nó có xóa người dùng khỏi mảng người dùng được kết nối không? – user3304007

+0

Nó nên loại bỏ nhưng tôi không chắc chắn. Đang thử mảng người dùng in sau khi đóng kết nối. –

+0

Xong. Làm thế nào tôi có thể in mảng người dùng? Trước đây tôi đã sử dụng cái này để xóa người dùng bị ngắt kết nối. xóa người dùng [socket.nickname] – user3304007