代码之家  ›  专栏  ›  技术社区  ›  Petr Skocik

Nodejs中的Slurping TCP Echo服务器

  •  0
  • Petr Skocik  · 技术社区  · 6 年前

    我尝试制作一个简单的TCP echo服务器,它首先读取所有输入,然后再发送一个副本。

    var net = require('net');
    
    var server = net.createServer(function(socket) {
        socket.write('Echo server\r\n');
    
        //socket.pipe(socket)
    
        socket.UsrData='';
        socket.on('data', function(chunk){
                socket.UserData+=chunk;
        });
        socket.on('end', function(){
                console.log('end');
                socket.end(socket.UserData);
        });
    });
    server.listen(1337, 'localhost');
    

    现在如果我用

    nc  -q0 localhost 1337 </etc/profile
    

    end
    events.js:183
          throw er; // Unhandled 'error' event
          ^
    
    Error: This socket has been ended by the other party
        at Socket.writeAfterFIN [as write] (net.js:364:12)
        at Socket.Writable.end (_stream_writable.js:563:10)
        at Socket.end (net.js:509:31)
        at Socket.<anonymous> (/home/petr/f/learn/nodejs/echo.js:20:11)
        at emitNone (events.js:111:20)
        at Socket.emit (events.js:208:7)
        at endReadableNT (_stream_readable.js:1064:12)
        at _combinedTickCallback (internal/process/next_tick.js:138:11)
        at process._tickCallback (internal/process/next_tick.js:180:9)
    

    我该怎么修?

    (

    socat  TCP4-LISTEN:1337,reuseport,fork EXEC:'./slurp'
    

    哪里 ./slurp

    #!/bin/sh -eu
    inp=$(cat)
    printf '%s\n' "$inp"
    

    )

    1 回复  |  直到 6 年前
        1
  •  1
  •   ottomeister    6 年前

    默认情况下,一旦Node.js套接字注意到连接的另一端已启动断开连接,它就会自动关闭。因此,您的服务器没有机会向客户端发送数据。当“end”事件在您的程序中激发时,您的套接字已经关闭,并且您会收到一个错误,因为程序尝试发送所收集的消息 UserData 插入闭合的插座。

    要获得所需的行为,必须告诉套接字,当它看到另一端启动了断开连接时,不要关闭它。通过将options对象作为第一个参数传递给 net.createServer ,其中该对象包含名为 allowHalfOpen true

        net.createServer( { allowHalfOpen: true }, function(socket) { ... } );
    

    (现有的connect handler函数将成为该调用的第二个参数。)执行此操作后,套接字将保持打开状态,程序将能够发送消息 用户数据 .

    有关详细信息,请参阅 https://nodejs.org/docs/latest-v8.x/api/net.html#net_net_createserver_options_connectionlistener