0

クライアント:

var iosocket = io.connect();
iosocket.on('connect', function () {
    iosocket.on('message', function(message) {
    console.log(message)
    });
});

$('#input').keypress(function(event) {
    if(event.which == 13) {
        event.preventDefault();
        iosocket.send($('#input').val());
    }
});

サーバー:(一部が必要です)

var socket = require('socket.io');
conn = function (socket) {
    console.log("connnect");
    socket.on('disconnect', function (socket) {
    console.log("disconnect");
    });  

socket.on('message', function (data) {
    var socket1 = new net.Socket();
    socket1.connect (PORT, HOST, function() {
    socket1.write(data);
    socket1.end();
    });

    socket1.on('data', function(data) {
    socket.broadcast.emit('message', data);
    socket.emit('message',data);
    });

    socket1.on('error', function(exception){
    console.log('Exception:');
    console.log(exception);
    });

    socket1.on('drain', function() {
    console.log("socket1 drain!");
    });

    socket1.on('timeout', function() {
    console.log("socket1 timeout!");
    });

    socket1.on('close', function() {
    console.log('Socket1 closed');
    });
});
}
var io = socket.listen(server, { log: false });
io.sockets.on('connection', conn );

問題1(解決しましたがフィードバックが必要です):クライアントで取得した応答(mkessage変数)は16進配列形式でした。setencodingとtostringメソッドを試しましたが、問題は解決しませんでした。次のコードは、16進配列を読み取り可能な文字列に変換しました。

byte = '';
for (var i=0; i < data.length; i++) {
byte += String.fromCharCode( parseInt(data[i], 16).toString(16) );
}

問題2:tcpソケットsocket1が毎回作成され、これを行うのに非常に時間がかかります。書き込みのたびに閉じられないようにsocket1を作成して使用するにはどうすればよいですか?
PORT HOSTで聞いている他の人のステータスは、それを強制的に閉じますか?

4

1 に答える 1

2

ソケットのエンコーディングを明示的に設定しようとしましたか?

socket.on('message', function (msg) {
    var socket1 = new net.Socket();
    socket1.setEncoding('utf8'); //< explicitly request utf8
    socket1.connect (PORT, HOST, function() {
        socket1.write(msg);
        socket1.end();
    });

詳細については、 NodeJSのドキュメントを参照してください。

これで問題が解決しない場合は、HOST:PORTでリッスンしているTCPサーバーのコードを共有できますsocket1か(初期化を参照)。

編集

以下のコメントで述べられているように、ソケットでsetEncoding()を呼び出さない限り、「data」コールバックはBufferオブジェクトを受け取ります。ブロードキャスト用に文字列に変換する必要があります。

socket1.on('data', function(data) {
    socket.broadcast.emit('message', data.toString());
});
于 2013-03-04T13:13:22.957 に答える