2017-03-09 52 views
0

我正在浏览器中使用net库和WebSockets实现套接字节点服务器。我成功使用telnet hostport,但浏览器工作不正常。浏览器成功连接到套接字服务器并发送消息。我的服务器实现了一个data事件,并立即触发closeend事件。 close,end事件执行删除客户端时,他们断开连接(关闭浏览器,连接松动...)。向套接字服务器发送消息后保持TCP套接字客户端

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

插槽服务器

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

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

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

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

+0

我想创建一个套接字tcp常规(没有请求特殊)。我曾经使用套接字io,但套接字io只是在套接字io和套接字io客户端之间进行通信。如何在浏览器中定期创建一个套接字tcp。 – Loint

+0

@ Ntlzz93这是不可能的。 – robertklep

相关问题