wake-up-neo.net

Domänenübergreifende Verbindung in Socket.IO

Kann Socket.IO domänenübergreifend verwendet werden? Wenn das so ist, wie? Die Möglichkeit wird im Web erwähnt, aber es werden nirgendwo Codebeispiele angegeben.

27
CamelCamelCamel

Zitieren des socket.io FAQ :

Unterstützt Socket.IO domänenübergreifende Verbindungen?

Absolut in jedem Browser!

Wie es geht: Native WebSockets sind vom Design aus domänenübergreifend, Socket.io stellt eine Flash-Richtliniendatei für die domänenübergreifende Flash-Kommunikation bereit, XHR2 kann CORS verwenden und schließlich können Sie JSONP immer verwenden.

28
igorw

** Socket.IO-Version -> 1.3.7 **

Kann Socket.Io domänenübergreifend verwendet werden? Ja absolut.

Wenn das so ist, wie? 

Option 1: Nur die Verwendung von Websockets erzwingen

Standardmäßig sind Websockets domänenübergreifend. Wenn Sie Socket.io zwingen, dies nur als Verbindung zwischen Client und Server zu verwenden, können Sie dies tun.

Serverseite

//HTTP Server 
var server = require('http').createServer(app).listen(8888);
var io = require('socket.io').listen(server);

//Allow Cross Domain Requests
io.set('transports', [ 'websocket' ]);

Client-Seite

var connectionOptions =  {
            "force new connection" : true,
            "reconnectionAttempts": "Infinity", //avoid having user reconnect manually in order to prevent dead clients after a server restart
            "timeout" : 10000, //before connect_error and connect_timeout are emitted.
            "transports" : ["websocket"]
        };

 var socket = io("ur-node-server-domain", connectionOptions);

Das ist es. Problem? Funktioniert nicht mit Browsern (für Clients), die keine Websockets unterstützen. Damit töten Sie so ziemlich die Magie von Socket.io, da es allmählich mit langen Abfragen beginnt, um später auf Websockets aufzurüsten (falls der Client dies unterstützt).

Wenn Sie sich zu 100% sicher sind, dass alle Ihre Clients mit HTML5-kompatiblen Browsern darauf zugreifen können, sind Sie bereit zu gehen.

Option 2: Erlaube CORS auf der Serverseite, lass Socket.io entscheiden, ob Websockets oder lange Abfragen verwendet werden sollen.

In diesem Fall müssen Sie nur die serverseitigen Einstellungen anpassen. Die Clientverbindung ist wie immer dieselbe.

Serverseite

//HTTP Server 
var express=require('express');
//Express instance
var app = express();

//ENABLE CORS
app.all('/', function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  next();
 });

Das ist es. Hoffe, es hilft allen anderen.

18
Chayemor

Geben Sie einfach Ihren Remote-Domänennamen ein, wenn Sie den clientseitigen Socket erstellen:

var socket = io.connect('http://example.com:8080');
17
vinyll

Socket.io unterstützt domänenübergreifende Verbindungen. Beachten Sie jedoch, dass Ihr Cookie nicht an den Server weitergeleitet wird. Sie müssen entweder:

(1) Entwerfen Sie ein alternatives Identifikationsschema (ein benutzerdefiniertes Token oder ein Javascript-Cookie. Denken Sie daran, dass dies nicht die eigentliche Sitzungs-ID sein sollte, es sei denn, Sie möchten sich dem Risiko von Sitzungsentführungen hingeben.

oder (2) Senden Sie zuerst eine gute alte HTTP-JSONP-Anforderung an den Server, um das Cookie zu erhalten. Dann wird es mit dem Socket Connection Handshake übertragen.

8
mikermcneil

Einfach und sicher!

Fügen Sie in der Hauptdatei vor io.on ('Verbindung') die Zeilen ein:

io.set('origins', 'yoursite.com:*');

io.on('connection', function (socket) {
3
user5046034

Ja tut es. Ich habe Cross Domain socket.io implementiert, um zu testen, ob es funktioniert.

<script src="http://your-nodejs-domain.com:3000/public/js/jquery.js"></script>
  <script src="http://your-nodejs-domain.com:3000/socket.io/socket.io.js"></script>
  <script>

      var socket = io.connect('http://your-nodejs-domain:3000');
      $(document).ready(function(){

          socket.on('test message', function(msg){
               console.log("Got the message: " + msg);
          });
      });

  </script>

Das sollte gut funktionieren.

1
Kurt Campher

erstellen Sie Ihren Server wie folgt:

const server = require('http').createServer();

const io = require('socket.io')(server, {
    origins:["127.0.0.1:8000"],
    path: '/',
    serveClient: false,
    // below are engine.IO options
    pingInterval: 20000,
    pingTimeout: 5000,
    cookie: false
});

io.on('connection', function(socket){
    console.log("here new user welcom")
});


server.listen(3000,function(){
    console.log('listening on *:3000')});

geben Sie im Ursprungs-Array einen gültigen Ursprung an

0