CNode

socket.io怎么连接远程地址呢

问答
Ppenweizgx发布于12 年前最后回复8 年前11 回复16047 浏览0 收藏

我想在我的页面(访问路径http://192.168.10.105:8080/abc或http://localhost:8080/abc)中通过socket.io去连接scoket 服务器,但是 io.connect好像有跨域的问题,不知道大家是怎么解决的呢 var chat1Socket = io.connect('http://192.168.10.105:9092/chat1');//这个访问不成功,好像是跨域的问题 var chat2Socket = io.connect('http://127.0.0.1:9092/chat2');//这个可以连接成功,用localhost和127.0.0.1都可以成功

查看回复

回复 (11)

C
captainblue2013#1·12 年前

不用chat1

P
penweizgx#2·12 年前

不用chat1也不可以,主要的问题是在访问地址IP和端口上

H
hliu2008#3·12 年前

我现在也在研究这个问题。 其实单纯的靠socket.io去访问跨域是可行的,出问题的是session,也就是cookie 你socket.io服务端 io.set('authorization', function (handshakeData, callback) { /*** } 肯定有这个认证,一旦跨域,handshakeData.headers.cookie是获取的服务器域的cookie. 而express的session管理也是将cookie记录在服务端里的,只有你访问服务端域的时候,cookie才会生成,这时才有所谓的session。 app.use(session({ resave: true, saveUninitialized: true, secret: config.session_option.secret, cookie: {maxAge: 1000 * 60 * 60 * 24 * 1}, store: storeMemory })); 在你服务端没有cookie记录的时候(默认为connectsid),直接通过客户端socket.io去远程链接是生成不了cookie的,同时也就获取不到,在认证这块就出了问题,所以就走不通。

B
bnuhero#4·12 年前
引用 hliu2008我现在也在研究这个问题。 其实单纯的靠socket.io去访问跨域是可行的,出问题的是session,也就是cookie 你socket.io服务端 io.set('authorization...

@hliu2008 前面放个ngnix做反向代理,把Web服务器和WebSocket服务器映射到同一个域。这样行不?

A
alsotang#5·12 年前
引用 bnuhero@hliu2008 前面放个ngnix做反向代理,把Web服务器和WebSocket服务器映射到同一个域。这样行不?

@bnuhero 如果 3楼 是正确的话,那做了反向代理也还是没解决 cookie 的问题吧

H
hliu2008#6·12 年前
引用 bnuhero@hliu2008 前面放个ngnix做反向代理,把Web服务器和WebSocket服务器映射到同一个域。这样行不?

@bnuhero 不行,这不是跨域的问题,而且必须得访问一个服务端的页面让他生成cookie使node的session生效才可以。 我目前暂时是通过隐藏一个iframe去访问一个服务端的空白页面,用来生成cookie里的connectsid值。虽然方法笨了点

P
penweizgx#7·12 年前

还是找不到好的方案,

C
captainblue2013#8·12 年前
引用 penweizgx不用chat1也不可以,主要的问题是在访问地址IP和端口上

@penweizgx 我就是这样做了的,你所说的不行,应该是别的原因,你要么贴出来,要么自己查。 socket.io连接远程,IP+端口就行,如果要分namespace,后面就路径就是。

D
dolphinfine#11·8 年前

有好的方案吗?我也遇到socket远程跨域这个问题了

参与回复
登录后即可参与回复。登录