求救Nodejs websocket问题

求救Nodejs websocket问题

写了个聊天室可是客户端链接服务器就卡住了 readystate一直是0 连接中状态 这是为什么 难道在connect时候需要别的操作吗 代码如下: 求救

服务端代码 <code>var connections = []; var net = require(‘net’); // 创建一个TCP服务器实例,调用listen函数开始监听指定端口 // 传入net.createServer()的回调函数将作为”connection“事件的处理函数 // 在每一个“connection”事件中,该回调函数接收到的socket对象是唯一的 net.createServer(function(sock) { // 我们获得一个连接 - 该连接自动关联一个socket对象 connections.push(sock); console.log('CONNECTED: ’ + sock.remoteAddress + ‘:’ + sock.remotePort); sock.write(‘fdsafdsafsa’); // 为这个socket实例添加一个"data"事件处理函数 sock.on(‘data’, function(data) { console.log('DATA ’ + sock.remoteAddress + ': ’ + data); // 回发该数据,客户端将收到来自服务端的数据 // sock.write(‘You said "’ + data + ‘"’); });

// 为这个socket实例添加一个"close"事件处理函数 sock.on(‘close’, function(data) { console.log('CLOSED: ’ + sock.remoteAddress + ’ ’ + sock.remotePort); }); }).listen(8081); console.log('Server listening on ’ + port); </code> 客户端代码 <code> var SocketCreated; var ws;

function createSocket (name) { if (SocketCreated && (ws.readyState == 0 || ws.readyState == 1)) { ws.close(); } Log(“准备连接到聊天服务器 …”); try { ws = new WebSocket(‘ws://localhost:8081?name=’+name); SocketCreated = true; } catch (ex) { Log(ex, “ERROR”); return; } ws.onopen = WSonOpen; ws.onmessage = WSonMessage; ws.onclose = WSonClose; ws.onerror = WSonError; }

function WSonOpen() { Log(“连接已经建立。”, “OK”); };

function WSonMessage(event) { Log(event.data); };

function WSonClose() { Log(“连接关闭。”, “ERROR”); };

function WSonError() { Log(“WebSocket错误。”, “ERROR”); };

function Log (text,type) { var li = document.createElement(‘li’); switch(type) { case ‘OK’: li.setAttribute(‘class’,‘ok’); break; case ‘ERROR’: li.setAttribute(‘class’,‘error’); break; default: break; } var chatDiv = document.getElementById(‘chatDiv’); var ul = chatDiv.getElementsByTagName(‘ul’)[0]; li.innerText = text; ul.appendChild(li); } </code>


11 回复

根据你的描述,你正在尝试使用 WebSocket 实现一个简单的聊天室,但客户端在尝试连接时遇到了问题。你提到 readyState 一直是 0,这表示连接还没有完全建立。

问题分析

  1. 服务端代码:你在使用 net 模块创建一个 TCP 服务器,而不是 WebSocket 服务器。
  2. 客户端代码:你尝试使用 WebSocket API (new WebSocket) 来连接到服务端,但服务端没有正确地处理 WebSocket 连接。

解决方案

你需要一个 WebSocket 服务器来处理 WebSocket 连接。这里我们使用 ws 模块来实现一个 WebSocket 服务器,并修改客户端代码以匹配这个服务器。

安装 ws 模块

首先,确保你安装了 ws 模块:

npm install ws

修改服务端代码

使用 ws 模块来创建 WebSocket 服务器:

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8081 });

wss.on('connection', function connection(ws) {
    console.log('A client connected');

    ws.on('message', function incoming(message) {
        console.log('received: %s', message);
        // 广播消息给所有连接的客户端
        wss.clients.forEach(function each(client) {
            if (client !== ws && client.readyState === WebSocket.OPEN) {
                client.send(message);
            }
        });
    });

    ws.on('close', function close() {
        console.log('A client disconnected');
    });
});

console.log('WebSocket server is running on ws://localhost:8081');

修改客户端代码

确保客户端使用正确的 WebSocket 地址并正确处理连接:

var ws;

function createSocket(name) {
    if (ws && (ws.readyState == 0 || ws.readyState == 1)) {
        ws.close();
    }
    console.log("准备连接到聊天服务器 …");
    try {
        ws = new WebSocket('ws://localhost:8081?name=' + name);
    } catch (ex) {
        console.error(ex);
        return;
    }
    ws.onopen = WSonOpen;
    ws.onmessage = WSonMessage;
    ws.onclose = WSonClose;
    ws.onerror = WSonError;
}

function WSonOpen() {
    console.log("连接已经建立。");
};

function WSonMessage(event) {
    console.log(event.data);
};

function WSonClose() {
    console.log("连接关闭。");
};

function WSonError() {
    console.error("WebSocket错误。");
};

createSocket('someName');

总结

通过使用 ws 模块创建 WebSocket 服务器,你可以解决客户端连接失败的问题。确保客户端和服务器都使用 WebSocket 协议进行通信。希望这能帮助你解决问题!


= =怎么没人

= =我知道 可是不用为什么不行呢 暂时不想用模块 不然都懒得想了

0.0为什么没人 大家都是用模块的么

…还是没人 太简单了没人理么

你的服务器用的原生socket,客户端用的websocket,都不是一个东西,协议都不一样怎么能通信呢?到githup上找找node.js的websocket服务器端模块

= =最近忙的都没来看 bae上不支持自定义模块还有socket.io socket.io试过了可行 但是不支持没办法 那些模块是咋写的呢 涉及到node底层的c吗? 我以为模块也是用nodejs写的 所以想问问有没有这种办法来着

推荐用ws

模块么? bae上没法装模块啊表示

从你的描述来看,你的服务端使用的是 net 模块创建了一个 TCP 服务器,而客户端则尝试使用 WebSocket 进行连接。这会导致问题,因为 net 模块提供的 TCP 服务器与 WebSocket 通信协议不兼容。

示例代码(改为 WebSocket 服务器)

首先,你需要安装 WebSocket 库,例如 ws

npm install ws

服务端代码

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8081 });

wss.on('connection', function connection(ws) {
    console.log('A client connected');

    ws.on('message', function incoming(message) {
        console.log('received: %s', message);
    });

    ws.send('Hello! Message from server.');
});

wss.on('close', function close() {
    console.log('Server is closed.');
});

客户端代码

客户端代码可以保持不变,但是确保你用的是 WebSocket 而不是 TCP。以下是简化版客户端代码:

var ws;

function createSocket(name) {
    if (ws && (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING)) {
        ws.close();
    }
    
    try {
        ws = new WebSocket('ws://localhost:8081?name=' + name);
        ws.onopen = WSonOpen;
        ws.onmessage = WSonMessage;
        ws.onclose = WSonClose;
        ws.onerror = WSonError;
    } catch (ex) {
        console.error(ex);
    }
}

function WSonOpen() {
    console.log("连接已经建立。");
};

function WSonMessage(event) {
    console.log(event.data);
};

function WSonClose() {
    console.log("连接关闭。");
};

function WSonError() {
    console.log("WebSocket错误。");
};

解释

  • 服务端:使用 ws 库创建 WebSocket 服务器,当客户端连接时,它会触发 connection 事件,并在控制台打印一条消息。当消息到达时,会触发 message 事件。

  • 客户端:尝试建立 WebSocket 连接,并在 onopen, onmessage, oncloseonerror 事件发生时分别调用相应的回调函数。

注意事项

确保你使用的库(如 ws)与你的 Node.js 版本兼容。如果问题仍然存在,请检查网络配置或防火墙设置。

回到顶部