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

时间:2017-03-09 09:14:13

标签: node.js sockets tcp

我正在浏览器中使用net库和WebSockets实现套接字节点服务器。我成功使用telnet host port,但浏览器工作不正常。浏览器成功连接到套接字服务器并发送消息。我的服务器实现data事件并立即触发closeend个事件。 closeend个事件在断开连接时删除客户端(关闭浏览器,连接松散......)。

我不希望浏览器发送消息然后松开连接。 有谁知道这是什么问题?

套接字服务器

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 个答案:

答案 0 :(得分:1)

WebSocket连接通过RFC 6455中记录的众所周知的协议进行工作。您的服务器没有实现此协议,它只是一个常规的TCP服务器。

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

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