5

Node.js で単純な TCP サーバーと単純な TCP クライアントを作成しました

これで、クライアントがサーバーに「exit」を送信すると、接続が正常に閉じられます。サーバーはソケット リストからソケットを削除し、「Bye bye!」を送信します。クライアントに。

クライアントの接続も閉じられますが、アプリはまだ他の入力を待っているため、停止せず、CTRL + C を入力する必要があります。

接続が閉じた後に追加しようとしましprocess.exit()たが、機能しません:

クライアントコード:

var net = require('net'),
    config = require(__dirname + '/config.json'),
    connection = net.createConnection(config.port, config.host);

connection.setEncoding('utf8');

connection.on('connect', function () {
    console.log('Connected');
});

connection.on('error', function (err) {
    console.error(err);
});

connection.on('data', function (data) {
    console.log('» ' + data);
});

connection.on('close', function() {
    console.log('Connection closed');
});

process.stdin.on('data', function (data) {

    if ((new String(data)).toLowerCase() === 'exit') {
        connection.end();
        process.exit();
    }
    else {
        connection.write(data);
    }

});

process.stdin.resume();

サーバーコード:

var server = require('net').createServer(),
    config = require(__dirname + '/config.json'),
    sockets = [];

server.on('connection', function (socket) {
    socket.setEncoding('UTF-8');

    socket.on('data', function (data) {

        console.log('Received data: ' + data);

        if (data.trim().toLowerCase() === 'exit') {
            socket.write("Bye bye!\n");
            socket.end();
        }
        else {
            sockets.forEach(function (client) {
                if (client && client != socket) {
                    client.write(data);
                }
            });
        }

    });

    socket.on('close', function () {
        console.log('Connection closed');
        sockets.splice(sockets.indexOf(socket), 1);

        console.info('Sockets connected: ' + sockets.length);
    });

    sockets.push(socket);
});

server.on('listening', function () {
    console.log('Server listening');
});

server.on('close', function () {
    console.log('Server is now closed');
});

server.on('error', function (err) {
    console.log('error:', err);
});

server.listen(config.port);

編集:

クライアント接続の「クローズ時」イベント ハンドラを追加しました。そのため、文字列「接続が閉じられました」がサーバーとクライアントによって出力されるようになりました。

4

5 に答える 5

4

これを探していると思います:socket.unref()。

Node.js ドキュメント ( https://nodejs.org/api/net.html#net_socket_unref ) から:

socket.unref()#

ソケットで unref を呼び出すと、これがイベント システムで唯一のアクティブなソケットである場合、プログラムを終了できます。ソケットがすでに unrefd である場合、再度 unref を呼び出しても効果はありません。

于 2015-07-30T05:07:20.370 に答える
0

サーバーでイベント:'close'を試してください:http: //nodejs.org/api/net.html#net_event_close

于 2012-10-24T15:34:18.680 に答える
0

ほとんどの場合、末尾に改行があるif ((new String(data)).toLowerCase() === 'exit')ため、成功しているとは思えません(サーバーでは比較を行う前ですが、クライアントではそうではありません)。datatrim()

それが修正された場合、論理的な問題があります。「exit」を取得すると、「exit」をサーバーに送信せずに接続を閉じるため、「exit」を探すサーバー コードは決して実行されません。

于 2012-10-24T15:09:54.880 に答える
0

process.exit()命令は、最後のイベント ハンドラーにのみ配置する必要があります。したがって、この場合、クライアント接続の「クローズ時」イベント ハンドラー内に配置する必要があります。

クライアント:

connection.on('close', function() {
    console.log('Connection closed');
    process.exit();
});
于 2012-10-25T07:28:31.587 に答える