2013-01-15 45 views
7

此問題涉及socket.io版本< 0.9.x. 新版本有不同的傳輸和設置傳輸的方法。node.js和socket.io。 websocket的傳輸類型配置?

我在兩週內測試節點js和socket.io。當我開始時,我在客戶端從socket.send(message)函數中得到問題。我無法發送任何消息到服務器。但我仍然可以從服務器接收消息。我解決了這個問題,當我發現服務器端的配置傳輸:

socket.set('transports',[ 
    'xhr-polling' 
    , 'jsonp-polling' 
]); 

一切都很好。現在我可以將消息發送到服務器。但我仍然有一個問題,爲什麼我必須配置傳輸。默認的socket.io使用像這樣的websocket傳輸設置:

socket.set('transports', [ 
    'websocket' 
    , 'flashsocket' 
    , 'htmlfile' 
    , 'xhr-polling' 
    , 'jsonp-polling' 
]); 

所以它首先使用websocket,而不是xhr-polling。但是當使用socket.send(msg)甚至socket.emit(...)時,服務器不能接收到客戶端發送的任何消息。

所以問題是:什麼不支持websocket在這裏?瀏覽器或node.js ...我很抱歉,我從谷歌搜索了很多頁面,但我還沒有找到答案。

我用node.js的0.8.16版本,socket.io版本0.9.13和最新的瀏覽器:Chrome瀏覽器,火狐,歌劇

我想使用的WebSocket不XHR輪詢。

回答

5

這很奇怪,因爲即使你的服務器配置不支持websockets,socket.io會選擇下一個最好的可用方法(在你的情況下是xhr-polling)。實際上,你甚至不需要設置這些傳輸,因爲socket.io會默認使用'websocket'作爲主要方法。這可能表示一些其他問題,可能與您的代碼?

什麼是不支持websockets絕對不是你使用的瀏覽器,當然也不是node.js。這將取決於您的服務器設置。

首先檢查:

  1. 你正在聽的端口是打開防火牆
  2. 你的Web服務器支持WebSockets的。如果您使用Apache和代理方式您的要求到內部IP:端口,除非你安裝的東西像apache-websocketpywebsocket

什麼終於解決了我的問題是要禁用Apache的偵聽端口80和具有的WebSocket將無法正常工作偵聽該端口的node.js。這是對我的幫助:https://stackoverflow.com/a/7640966/2347777