2017-03-09 13 views
0

netライブラリとWebSocketをブラウザで使用してソケットノードサーバーを実装しています。 telnet hostportを正常に使用していますが、ブラウザが正しく動作しません。ブラウザはソケットサーバーに正常に接続し、メッセージを送信します。私のサーバーはdataイベントを実装し、すぐにcloseイベントとendイベントをトリガーします。 closeendイベントを切断するとクライアントが削除されます(ブラウザーをオフにする、接続が緩んでいる...)。ソケットサーバーにメッセージを送信した後に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 

ServerはHello Serverをログに記録することはできませんヘッダーの代わりにクライアントからもサーバーの損失クライアントのメッセージをすぐに.. ..お手伝いください!

答えて

1

WebSocket接続は、RFC 6455に記載されているよく知られているプロトコルで動作します。あなたのサーバーはこのプロトコルを実装していません。通常のTCPサーバーです。

ブラウザがWebSocket接続を行い、サーバがプロトコルに従って応答しない場合、ブラウザは接続を閉じます(おそらく、プロトコルエラーメッセージがコンソールに記録されます)。

WebSocketサーバーを実装するには、wsパッケージをご覧ください。

+0

ソケットtcp regular(リクエストは特別ではありません)を作成したいと思います。私はソケットioを使用していましたが、ソケットioとソケットioクライアントの間でのみ通信します。どのようにブラウザでソケットtcpを定期的に作成するのですか? – Loint

+0

@ Ntlzz93できません。 – robertklep

関連する問題