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

在向套接字服务器发送消息后保留TCP套接字客户端

子车凯泽
2023-03-14

我正在使用网络库和浏览器上的WebSocket实现一个套接字节点服务器。我正在成功使用telnet主机端口,但浏览器工作不正常。浏览器成功连接到套接字服务器并发送消息。我的服务器实现了一个数据事件,并立即触发关闭结束事件<代码>关闭,结束事件在断开连接时执行删除客户端(关闭浏览器,连接松动…)。

我不希望浏览器发送消息,然后断开连接。有人知道问题出在哪里吗?

套接字服务器

var express = require('express');
var app = express();
var path = require('path');
var cors = require('cors');
var config = require(path.join(__dirname, '/config.json'));
var net = require('net');
app.use(cors());

var serverSocket = net.createServer(function(socket) {
    socket.write('Connected socket server\r\n');
});

serverSocket.listen(3332, () => {
    console.log('opened socket on', serverSocket.address());
});

var client = [];
serverSocket.on('connection', (conn) => {
    console.log('client ', client.length, ' connected');

    conn.id = Math.floor(Math.random() * 1000);
    while (client.indexOf(conn) !== -1) {
        // socket id exits
        conn.id = Math.floor(Math.random() * 1000);
        console.log('repeat');
    }
    client.push(conn);
    console.log('client id ', conn.id);
    conn.on('data', function(data) {
        console.log(data.toString('utf8'));
    });

    conn.on('end', function() {
        // client.splice(client.indexOf(conn), 1);
        // console.log(conn.id + ' disconnected');
        // console.log('clientArr ' + client);
    });

    conn.on('error', (err) => {
        console.log("Caught flash policy server socket error: ");
        console.log(err.stack);
    });

    conn.on('close', (e) => {
        client.splice(client.indexOf(conn), 1);
        console.log(conn.id + ' disconnected');
        console.log('clientArr ' + client);
    });

});

app.listen(config.port);
console.log('Server start on port: ' + config.port);

客户端(浏览器)

<!DOCTYPE html>
<html>
<head>test</head>
<body>
<div class="">
    <button>button</button>
</div>
<script type="text/javascript">
$(document).ready(function() {
    // Create WebSocket connection.
    const socket = new WebSocket('ws://192.168.0.111:3332');

    // Connection opened
    socket.addEventListener('open', function(event) {
        socket.send('Hello Server!');
    });
});
</script>
</body>
</html>

浏览器连接到服务器时的输出

Server start on port: 6010
opened socket on { address: '::', family: 'IPv6', port: 3332 }
connecting mongoose
client  0  connected
client id  685
GET / HTTP/1.1
Host: 192.168.0.111:3332
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: http://localhost:8643
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: vi,en;q=0.8,zh-CN;q=0.6,zh;q=0.4,pt;q=0.2
Sec-WebSocket-Key: lNMRkgoSb8xOH5iuE/f4UA==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits


685 disconnected
clientArr

服务器无法从客户端记录Hello Server,而不是头文件。服务器也会立即丢失客户端的发送消息。。请帮忙!

共有1个答案

西门逸仙
2023-03-14

WebSocket连接通过RFC 6455中记录的众所周知的协议工作。你的服务器没有实现这个协议,它只是一个普通的TCP服务器。

当浏览器将WebSocket连接到您的服务器,而您的服务器没有根据协议做出响应时,浏览器会关闭连接(可能会将协议错误消息记录到控制台)。

要实现WebSocket服务器,请查看ws包。

 类似资料:
  • 如果我不关闭套接字: 客户端没有输出。服务器从不发送消息,或者客户端从不接收消息。 有人知道发生这种情况的可能原因吗?客户端使用一个线程接收消息,一个线程发送消息。客户端套接字在主客户端线程中创建,因此接收者和发送者线程使用当前套接字进行通信。 提前谢了。

  • 关于使用Java套接字的例子有上百万个——每个都是一样的!每一个都显示了一个正在创建的客户机套接字,一些文本正在发送,并且套接字已关闭。 我正在编写一些测试代码。我希望我的客户端循环并发送相当多的消息。每次关闭客户端套接字并重新创建似乎很傻,所以我想我只创建一个客户端套接字,循环循环并在同一个套接字上发送数据。问题是——我的服务器套接字不会打印出它收到的内容,直到客户端发送最后一条消息并且客户端套

  • 我有套接字服务器(java桌面应用程序)正在等待从java webapp(套接字客户端)连接。通信看起来还可以,我在客户端看到来自服务器的消息,但是当我发送消息时,我在服务器端没有收到任何消息。会有什么问题呢?当我检查服务器与telnet,一切正常。下面是我的代码: 服务器: 客户: 谢谢帮忙!

  • 我对Android系统是新手。我有一个客户端类,我的主要活动引用。client类将客户端套接字连接到充当服务器的外部设备,但是它从不将我试图发送的消息发送到服务器。我知道这不是连接,因为在创建套接字时,我将setKeepAlive()设置为true,当我试图发送消息时不会引发异常,socket.isconnected()返回true,如果我试图在发送消息之前连接套接字,它会引发“已经连接”的异常。

  • 真的需要你帮忙。 我的项目是通过电缆连接两台PC机,并使用tcp套接字将客户端文本框形式的字符串发送到服务器。问题是ATI只能发送一个字符串,然后连接就会关闭。 注意:某个端口上的连接将在表单加载中建立并成功。