Send additional data on socket connection

前端 未结 7 454
清酒与你
清酒与你 2020-12-24 10:12

How to best send additional data upon socket connection?

Client:

socket.on(\'connect\',function(){ 
//I\'d like set some values and pass them up to t         


        
相关标签:
7条回答
  • 2020-12-24 10:37

    The connection events get fired as soon as the TCP connection is established. There's no way to send anything in between.

    What you can do is to simply take the first message send by the server and put the data in that message. I'd strongly suggest to roll some thin protocol for this, so you would have multiple types of messages and use those to determine how the code should process the data.

    This would be more extendable too, since it's fairly easy to come up with a generic architecture for that. If you want to wait for the userdata to come in first you can simply add some state to your connections.

    0 讨论(0)
  • 2020-12-24 10:40

    this my code for sending query data to nodejs and server.io server client

    var socket = io.connect(window.location.origin,{query:'loggeduser=user1'});
    
    io.sockets.on('connection', function (socket) {
        var endp = socket.manager.handshaken[socket.id].address;
        console.log("query... " +  socket.manager.handshaken[socket.id].query.user);
    });
    

    query...user1

    0 讨论(0)
  • 2020-12-24 10:41

    I have a different approach - emit an event right after connecting, with the data:

    socket.on('connect',function(){ 
        // Send ehlo event right after connect:
        socket.emit('ehlo', data);
    });
    
    io.on('connection', function(client){
        // Receive ehlo event with data:
        client.on('ehlo', function(data) {
        });
    });
    

    You can hold a variable/object, and say, when there is no ehlo event with data, the other events are ignored until ehlo is sent.

    If this does not satisfy, you can send data right when connecting, I won't copy the code but it is in this answer: https://stackoverflow.com/a/13940399/1948292

    0 讨论(0)
  • 2020-12-24 10:47

    You should send your data either in connect or on create:

    var s = io('http://216.157.91.131:8080/', { query: "foo=bar" });
    s.connect();
    
    var c = io.connect('http://216.157.91.131:8080/', { query: "foo=bar" });
    

    With the new version of socket.io, on server is where the things have been changed:

    var io = require('socket.io')(server);
    
    io.use(function(socket, next) {
      var handshakeData = socket.request;
      console.log("middleware:", handshakeData._query['foo']);
      next();
    });
    
    0 讨论(0)
  • 2020-12-24 10:48

    I found the answer located here really helpful in this regard: Send custom data along with handshakeData in socket.io?

    Also brushing up on the following documentation helps explain ways to tie variables to the handshake object which can be accessed from the socket object during the connection: https://github.com/LearnBoost/socket.io/wiki/Authorizing#global-authorization

    0 讨论(0)
  • 2020-12-24 10:55

    I'm assuming you will use SSL.

    Using querystrings to send sensitive data is not a good security practice (why?). I think that if you need to send non-sensitive data, then Miquel answer is the fastest and more easy one, but if sensitive data is what you need to send, then something like Daniel W. is the best approach to take.

    For an authentication approach, you can take a look at this github project (socketio-auth) which, beyond the fact that it is currently with no maintenance, can give you a good idea of how to deal with the problem.

    0 讨论(0)
提交回复
热议问题