net.Socket怎样主动断开某个客户端的连接
发布于 9 年前 作者 50css 10735 次浏览 最后一次编辑是 8 年前 来自 问答

只引入这个模块的var net = require(‘net’); 程序有两个地方要服务器端主动断开客户端的连接的,使用了下面这两行代码: self.socket.end(packaging(‘login\n0’));//登录失败,主动断开他 if(client[client_index].socket.address())client[client_index].socket.end();//超时不活动,断开这个客户端的连接 测试时在一台电脑客户几个客户端,在另一台电脑登录几个客户端,然后把其中一台电脑的网线拨掉,让服务器会运行“超时不活动,断开这个客户端的连接”这个功能,有时会发现出现这样两种错误: dir error { [Error: This socket has been ended by the other party] code: ‘EPIPE’} dir error { [Error: read ECONNRESET] code: ‘ECONNRESET’, errno: ‘ECONNRESET’, syscall: ‘read’ } 我也不知该怎样确定是socket.end的错误,还是socket.write的错误,错误信息是sock.on(‘error’,function (err){ console.log(‘dir error’, err); 这行代码显示的。 请教:这个问题该怎样排查?或net.Socket主动断开某个客户端的连接应该是怎样的流程或调用什么方法才是正确的?

5 回复

可以用socket.setTimeout吧,超时时间根据你心跳的周期而定,我是用的这种,心跳2-3分钟,超时10分钟。不知道是否适合你的场景

主动断在 客户端用socket.end(), 在服务端用getConnections()查看

比如是竞争对手或黑客知道我这服务器的IP和这个程序监听的端口的,他们写一个恶意客户端程序来连接,他们的客户端不肯配合关闭连接,他们会经常发数据,也不会发生socket.setTimeout,那我们服务器端该怎样断开他的连接?是socket.end还是什么方法?

@50css 这就需要你设计报文了,如果报文格式不正确,就果断end()这个客户端。

你可以试试前面setTimeout的时间心跳与报文格式相结合。。。。

回到顶部