socket-io从本地非浏览器客户端未收到但由浏览器客户端收到的服务器发出

时间:2018-03-25 17:43:47

标签: javascript node.js sockets

以下是我所写内容的描述。

ioServer1.js文件创建一个socket.io服务器并打开一个端口以侦听3000.同一个文件还打开一个客户端连接到服务器端口3001(使用socket.io-client)。当通过浏览器访问时,ioSever1.js也提供index.html(使用localhost:3000)。编写index.html,其作为服务器的浏览器客户端。 ioServer1.js使用io.emit向新连接上的所有客户端发送。

ioServer2.js与ioServer1.js相同,不同之处在于它侦听3001并打开与3000的客户端连接。

我在两个不同的git bash终端上运行ioServer1.js和ioServer2.js。以下是发生的事情:

所有客户--->正确接收和记录服务器消息;客户端是基于终端本机还是基于浏览器。

在服务器上--->客户留言。从服务器到客户端的io.emit和socket.emit正由任何浏览器客户端接收,但本机客户端。因此,运行ioServer1.js(ioServer2的客户端)的终端不会记录来自服务器ioServer2.js的任何消息。

我在ioServer1.js和index.html文件中包含了代码。 ioServer2.js文件仅在它正在侦听的端口(3001)中不同,并使客户端连接到(3000)。感谢任何有关调试的帮助

ioServer1.js:

var port="3000";
var express=require('express');
app=express();
var http=require('http');
var server=http.createServer(app).listen(port);
var io=require("socket.io")(server);

app.use(express.static('./'));

console.log(`io server listening on port ${port}`);

io.on('connection',(socket)=>{
    console.log(`Connection by socket with id ${socket.id}`);//This works

        socket.emit("message",`socket.emitMsgFromServer3000: You are being Served by port: ${port}`);//Works only for browser clients
        io.emit("message",`io.emitMsgOriginSever3000:socket with id ${socket.id} connected`);//Works only for browser clients


    socket.on("initialMessageFromClient",(message)=>{
            console.log(message);
        });
    socket.on("message",(message)=>{
            console.log(message);
        });

});

var socketioClient = require('socket.io-client');// Making a client connection to 3001
ip='http://localhost:3001';
neighborRpi2=socketioClient.connect(ip, {reconnection: true});

的index.html:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Page Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="jquery-3.2.1.min.js" type="text/javascript"></script>
    <script src="socket.io-client.min.js"></script> ><!-- this is needed for client to communicate back to server -->
    <script>
    var socket = io({transports: ['websocket'], upgrade: false});  /*socket.io-client.min.js needed for this */
    socket.on('connect',()=>{
        /* Emit a message to server with IRQ "initialMessageFromClient" */
        socket.emit("initialMessageFromClient","MsgFromClient: Hello");
    });
    socket.on("message",(message)=>{
        printMessage(message);
    });

    function printMessage(message) {
        $("#messages").append($('<li>').text(message)); /* Jquery is being used here to get to id messages in index.html */
    }
    </script>

</head>
<body>
This is the Client
<!-- Thus div has id messages. Client code in client.js populates this div -->
    <div id="messages"> </div>
</body>

</html>

1 个答案:

答案 0 :(得分:0)

You need to listen for messages on the CLI client

var port = "3000";
var express = require('express');
app = express();
var http = require('http');
var server = http.createServer(app).listen(port);
var io = require("socket.io")(server);

app.use(express.static('./'));

console.log(`io server listening on port ${port}`);

io.on('connection', (socket) => {
    console.log(`Connection by socket with id ${socket.id}`); //This works

    socket.emit("message", `socket.emitMsgFromServer3000: You are being Served by port: ${port}`); //Works only for browser clients
    io.emit("message", `io.emitMsgOriginSever3000:socket with id ${socket.id} connected`); //Works only for browser clients

    socket.on("initialMessageFromClient", (message) => {
        console.log(message);
    });    
});

var socketioClient = require('socket.io-client'); // Making a client connection to 3001
ip = 'http://localhost:3001';
neighborRpi2 = socketioClient.connect(ip, {
    reconnection: true
});
neighborRpi2.on('connect', () => {
    neighborRpi2.emit("initialMessageFromClient", "MsgFromClient: Hello");
});
neighborRpi2.on("message", (message) => {
    console.log("Recieved on CLI client", message);
});