当前位置: 首页 > 知识库问答 >
问题:

为什么web套接字在nodejs上有不同的表现?

龙浩博
2023-03-14

我有一个Nodejs server.js代码:

var http = require('http');
var express = require('express');
var app = express();
var path = require('path');

var conn= http.createServer(app).listen(3000, function () {
  console.log("server Running at Port 3000");
});

var WebSocketServer = require('ws').Server;
var wss = new WebSocketServer({server: conn});

我有一个带有java脚本的index.html代码:

<html>
<body> 

<script src="myscript.js"></script>

</body>
</html>

myscript.js中,我有:

var connection = new WebSocket('ws://localhost:3000');

当我在浏览器上打开http://localhost:3000时,这种方式运行良好。

var WebSocketServer = require('ws').Server,
wss = new WebSocketServer({ port: 3000}) ;

wss.on('connection', function (connection) {

});

wss.on('listening', function () {
    console.log("Server started...");
});

共有1个答案

尹凌龙
2023-03-14

为了明确回答您的问题:为什么web套接字在NodeJS上的行为不同?答案是:不应该。在代码的第二个版本中,您没有向端口3000上的客户机提供任何HTML或JS文件,因此浏览器无法下载任何HTML。

如果希望它按预期工作,则需要向访问http://localhost:3000/的浏览器提供一些HTML和JS文件,否则它将无法连接。

我编写了一些示例代码--服务器端和客户端--说明如何使用WebSocket来完成您在这里尝试做的事情。它在GitHub上可用,我最初写它是为了这个答案:socket.io和WebSockets之间的区别。

var path = require('path');
var app = require('express')();
var ws = require('express-ws')(app);
app.get('/', (req, res) => {
  console.error('express connection');
  res.sendFile(path.join(__dirname, 'ws.html'));
});
app.ws('/', (s, req) => {
  console.error('websocket connection');
  for (var t = 0; t < 3; t++)
    setTimeout(() => s.send('message from server', ()=>{}), 1000*t);
});
app.listen(3001, () => console.error('listening on http://localhost:3001/'));
console.error('websocket example');

使用vanilla JavaScript的WebSocket客户端示例:

var l = document.getElementById('l');
var log = function (m) {
    var i = document.createElement('li');
    i.innerText = new Date().toISOString()+' '+m;
    l.appendChild(i);
}
log('opening websocket connection');
var s = new WebSocket('ws://'+window.location.host+'/');
s.addEventListener('error', function (m) { log("error"); });
s.addEventListener('open', function (m) { log("websocket connection open"); });
s.addEventListener('message', function (m) { log(m.data); });

来源:https://github.com/rsp/node-websocket-vs-socket.io/blob/master/ws.html

与其调试一个不起作用的代码,有时最好从起作用的东西开始,然后再从那里开始。看看它是如何工作的,可以随意更改它并在您的项目中使用它--它是在麻省理工学院许可下发布的。

 类似资料:
  • 服务器: 客户: 服务器开始侦听: 每个客户端连接将获得一个单独的套接字进行通信,所有的套接字都使用相同的服务器端TCP端口进行通信。

  • 我在N主页看到两个版本ode.js下载如下 我应该使用哪一种,有什么区别?

  • 我不明白为什么下面的代码在Java中会出错: 错误发生在部分。错误有: I:\documents\netbeansprojects\testingground\src\testingground\TestClass.java:22:错误:非静态变量这不能从静态上下文引用public static final TestClass常量=new InnerClass(5);^I:\documents\n

  • 问题内容: 在一个Android应用中,我将此代码添加到 onCreate() 进口是: 代码可以编译,但是出现异常: 在不同的上下文中,故障会导致(即 _java.lang.ArrayStoreException:java.net.Socket无法存储在类型为java.io.Closeable []的数组中_ )。 我想念什么吗?知道该怎么办吗? 编辑 类似,当按原样使用时,它会导致 java.

  • 在nodeJS应用程序中,我希望通过其UNIX套接字。我用这个包裹https://mongodb.github.io/node-mongodb-native/?jmp=docs(版本3.1.6),通过这种方式: 此处的文档中引用了URI:https://docs.mongodb.com/manual/reference/connection-string/#unix-域套接字。但在我的例子中,它失

  • 当我进行套接字编程时,我无法清楚地理解。 我的理解是 如果我使用此选项打开套接字,表示我可以在header之前创建自己的header,但最终数据以 /code>协议的格式发送。我的理解是正确的。如果错了,可以一些解释。 谢谢