Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js:即使AllowAlfOpen设置为True,客户端也会与服务器断开连接_Javascript_Node.js_Sockets_Server_Client - Fatal编程技术网

Javascript Node.js:即使AllowAlfOpen设置为True,客户端也会与服务器断开连接

Javascript Node.js:即使AllowAlfOpen设置为True,客户端也会与服务器断开连接,javascript,node.js,sockets,server,client,Javascript,Node.js,Sockets,Server,Client,我正在尝试创建一个简单的Node.js脚本,如果未使用分配的端口,它将创建一个服务器;如果正在使用端口,它将连接到服务器。我使用递归方法(使用链接作为引用),因此我在两个不同的cmd窗口上运行相同的.js文件 问题是,无论何时客户端连接到服务器,它都会自动进入“结束”侦听器,我不知道为什么。在阅读了文档之后,我发现了AllowAlfOpen属性,API中提到了以下内容: 如果AllowAlfOpen为true,那么当套接字的另一端发送FIN数据包时,套接字不会自动发送FIN数据包 我认为这是显而

我正在尝试创建一个简单的Node.js脚本,如果未使用分配的端口,它将创建一个服务器;如果正在使用端口,它将连接到服务器。我使用递归方法(使用链接作为引用),因此我在两个不同的cmd窗口上运行相同的.js文件

问题是,无论何时客户端连接到服务器,它都会自动进入“结束”侦听器,我不知道为什么。在阅读了文档之后,我发现了AllowAlfOpen属性,API中提到了以下内容:

如果AllowAlfOpen为true,那么当套接字的另一端发送FIN数据包时,套接字不会自动发送FIN数据包

我认为这是显而易见的解决方案,所以我在服务器上将属性设置为true,但这也不起作用

代码如下:

var net = require('net');

var PORT_NUMBER = 1337;

connectToPort = function(connection) {
    if(connection === "server") { // Connect as server to the port.
        connectAsServer();
    } else if (connection == "client") { // Connect as client to the port.
        connectAsClient();
    } else {
        console.log("Incorrect Type Of Connection Passed.");
    }
}

connectAsServer = function() {
    // Attempt to create server.
    var server = net.createServer({allowHalfOpen:true}, function (socket) {
        socket.allowHalfOpen = true;

        socket.write('Hello from Server\r\n');
        socket.end("hello");
        console.log("someone went into server.");
        socket.pipe(socket);
    });

    console.log("Trying to Open Port " + PORT_NUMBER);

    server.listen(PORT_NUMBER, function() {
        console.log("\nServer 2 is now the official server. \n");
    });

    server.on('error', function(err) {
        console.log("error is " + err.code);
        if(err.code == 'EADDRINUSE') {
            console.log('Port is in use, becoming client...');
            setTimeout(function () {
              server.close();
              connectToPort("client");
            }, 1000);
        }
        if(err.code == 'ECONNRESET') {
            console.log("connection reset error.");
        }
    });

    server.on('end', function() {
        console.log("server 2 disconnected from port");
    });
}

connectAsClient = function() {

    var client = net.connect({port: PORT_NUMBER}, function() { //'connect' listener
      console.log('THIS IS CLIENT connected to server!');
    });

    client.on('data', function(data) {
      console.log(data.toString());
      client.write('hello world! from client!!\r\n');
    });

    client.on('end', function() {
        // client automatically goes here. 
        console.log('disconnected from server');
    });

    client.on('error', function(err) {
        console.log("there was an error in the client and the error is: " + err.code);
    });
}

connectToPort("server");
以下是控制台的输出:

对于服务器:

对于客户:

我本质上想要的是,只有当服务器关闭或其他事件发生时,客户端才会断开连接。但理想情况下,我希望它连接到服务器,以便在它们之间交换数据

我做错什么了吗?为什么即使服务器上AllowAlfOpen为true,FIN包仍被发送


谢谢,

我看到了我的错误,我有以下几行:

socket.end("hello");
在服务器代码中,这基本上杀死了客户端