socket.io不断尝试在错误的地址

时间:2016-01-10 09:47:19

标签: node.js socket.io polling

嘿,我正在尝试将socket.io与跨域一起使用。例如,假设域名为:https://client.domain.comhttps://server.domain.com。我的客户端代码如下所示:

socket = io.connect("https://server.domain.com");
socket.on("connect", function () {
    console.log("socketio Connected to server!");
});
socket.emit("test", {"test":"test"});

服务器端:

var fs = require('fs');
var https = require('https');
var express = require('express');
var socketIO = require('socket.io');
var app = express();

// Settings
var serverOptions = {
  key: fs.readFileSync('privkey1.pem'),
  cert: fs.readFileSync('cert1.pem')
};

var serverPort = 443;

// Logic
var server = https.createServer(serverOptions, app);
var io = socketIO(server);

io.on('connection', function(socket) {
  socket.on("test", function(data) {
    console.log(data);
  });
});

server.listen(serverPort, function() {
  console.log('server up and running at %s port', serverPort);
});

一切正常,消息来回发送。但有些reasone socket.io一直试图使用轮询和错误的域。几乎每一秒我都看到这些要求:

Request URL:https://client.domain.com/socket.io/?EIO=3&transport=polling&t=1452418594321-145
Request Method:GET
Status Code:302 OK

为什么socket.io会这样做?如何关闭它?

编辑:更有意思的是,如果我注释掉所有与socket.io相关的代码并且只留在<script src="https://server.domain.com/socket.io/socket.io.js"></script>中,它仍然会继续发出前面描述的这些HTTP请求。

EDIT2:不确定这是否会产生任何影响,但实际上这些域不是一个域的子域。它们是https://clientdomain.comhttps://serverdomain.com

2 个答案:

答案 0 :(得分:0)

如果您使用nginx,我认为您的问题来自您配置它的方式。您绝对需要location

中所述的location / { proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; ... } 区块中的以下内容

确保正确设置了这些标头:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">
    <TextView android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="dishname"
        android:id="@+id/item_name"
        android:textSize="24dp"
        android:textColor="#396fd1"
        android:layout_alignParentTop="true"
        android:layout_alignStart="@+id/item_type" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="price"
        android:id="@+id/item_price"
        android:textSize="16dp"
        android:layout_below="@+id/item_name"
        android:layout_toEndOf="@+id/item_name"
        android:layout_marginStart="32dp" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="type"
        android:id="@+id/item_type"
        android:textSize="12dp"
        android:layout_below="@+id/item_name"
        android:layout_alignStart="@+id/item_nofingredients" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="#"
        android:id="@+id/item_nofingredients"
        android:textSize="12dp"
        android:layout_below="@+id/item_type"
        android:layout_alignParentStart="true"
        android:layout_marginStart="15dp" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Ingredients"
        android:id="@+id/textView5"
        android:textSize="12dp"
        android:layout_below="@+id/item_type"
        android:layout_toEndOf="@+id/item_type" />
    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/deleteButton"
        android:layout_alignBottom="@+id/item_price"
        android:layout_alignParentEnd="true"
        android:layout_marginEnd="19dp"
        android:background="@android:color/transparent"
        android:src="@android:drawable/ic_menu_delete"/>
</RelativeLayout>

Socket.IO很好地处理了CORS,所以我怀疑问题依赖于此。

答案 1 :(得分:0)

您看到的请求是因为您从https://client.domain.com为客户提供服务。

Request URL:https://client.domain.com/socket.io/?EIO=3&transport=polling&t=1452418594321-145

只是客户端获取socket.io的文件,以便它可以使用io对象。这与https://server.domain.com的连接无关,因为它是从https://client.domain.com提供的socket.io文件的请求。

您的代码正在使用从https://server.domain.com通过https // server.domain.com收到的socket.io源文件将客户端连接到https://client.domain.com。从服务器收到文件后,它们将通过与https://client.domain.com的连接提供给客户端。

基本上,请求只是代码的说法,即它从客户端域请求socket.io文件,这些文件来自服务器域,但是通过客户端域发送到实际客户(不是客户域)。