簡體   English   中英

socketio 客戶端沒有收到 NodeJS 發出的消息

[英]socketio client didn't received the NodeJS emitting message

[解決了]

問題:socket.io 版本。

描述: socket.io 版本 3.0.4不工作。 2.3.1 版正在運行。

https://github.com/thura-ntu/simple-socket-io-chat.git

==== 起源問題

我創建了一個簡單的socketio服務器=>客戶端連接,如下所示,我得到“客戶端連接[id=Uen6E2T9OCJOCpy2AAAI]”作為客戶端連接。 但是客戶端沒有收到服務器發出的消息。 請幫我。

=== 更新了

完整的源代碼。

現在我意識到,套接字只是握手,但服務器和客戶端既不發送也不接收對方。 我該如何解決?

服務器.js

var app = require("express")();
var mysql = require("mysql");
var http = require('http').Server(app);
var io = require("socket.io")(http);

/* Creating POOL MySQL connection.*/



var pool = mysql.createPool({
    connectionLimit: 100,
    host: host,
    user: user,
    password: password,
    database: database,
    debug: false
});


/*  This is auto initiated event when Client connects to Your Machien.  */

io.on('connection', function (socket) {
    var hs = socket.handshake;
    console.log(hs);
    console.log('A socket with sessionID ' + hs  + ' connected!');
    console.info(`Client connected [id=${socket.id}]`);

    socket.on('status added', function (status) {
        add_status(status, function (res) {
            if (res) {
                io.emit('refresh feed', status);
            } else {
                io.emit('error');
            }
        });
    });
});

var add_status = function (status, callback) {
    pool.getConnection(function (err, connection) {
        if (err) {
            callback(false);
            return;
        }
        connection.query("INSERT INTO `status` (`s_text`) VALUES ('1');", function (err, rows) {
            connection.release();
            if (!err) {
                callback(true);
            }
        });
        connection.on('error', function (err) {
            callback(false);
            return;
        });
    });
}

http.listen(3000, function () {
    console.log("Listening on 3000");
});

客戶端.html

<html>
<head>
    <title>Socket.io</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/3.0.4/socket.io.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
    <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
    <script>
        $(document).ready(function () {
            var socket = io('localhost:3000');
            $("#add_status").click(function () {
                socket.emit('status added', $("#comment").val());
            });
            socket.on('refresh feed', function (msg) {
                $("#show_comments").append(msg + '<br /><br />');
            });
        });
    </script>
</head>
<body>
<div id="comment_box" style="padding:5%;">
    <textarea id="comment" rows="5" cols="70"></textarea><br/><br/>
    <input type="button" id="add_status" value="Add Status">
</div>
<div
        id="show_comments"
        class="jumbotron"
        style="width: 38%;
                height: 100%;
                padding: 2%;
                margin-left:5%;
                margin-top:-53px;"
>
</div>
</body>
</html>

socket.handshake

{ headers:
   { host: 'localhost:3000',
     connection: 'keep-alive',
     'sec-ch-ua':
      '"Google Chrome";v="87", " Not;A Brand";v="99", "Chromium";v="87"',
     accept: '*/*',
     'sec-ch-ua-mobile': '?0',
     'user-agent':
      'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
     origin: 'http://localhost:63342',
     'sec-fetch-site': 'same-site',
     'sec-fetch-mode': 'cors',
     'sec-fetch-dest': 'empty',
     referer: 'http://localhost:63342/',
     'accept-encoding': 'gzip, deflate, br',
     'accept-language': 'en-GB,en-US;q=0.9,en;q=0.8' },
  time:
   'Sat Jan 02 2021 16:35:43 GMT+0800 (Singapore Standard Time)',
  address: '::1',
  xdomain: true,
  secure: false,
  issued: 1609576543893,
  url: '/socket.io/?EIO=4&transport=polling&t=NR2FFQE',
  query: { EIO: '4', transport: 'polling', t: 'NR2FFQE' } }

您需要將 HTTP 服務器傳遞給 socket.io

let io = require('socket.io').listen(http); // incorrect

利用:

let io = require('socket.io')(http);

最后希望您在客戶端 html 中包含 socket.io-client 庫。 使用 CDN 或本地目錄中的相對路徑

<script src="https://cdn.socket.io/socket.io-3.0.1.min.js"></script>
<script>
     const socket = io.connect('localhost:8085');
     socket.on('Welcome', function (data) {
         console.log(data);
     });
</script>

如果您收到CORS錯誤(檢查控制台),請使用:

let io = require('socket.io')(http, {
    cors: {
        origin: "*", // Be careful with * 
    }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM