node tcp客户端如何强制发送数据?
发布于 10 年前 作者 myhirra 4931 次浏览 最后一次编辑是 8 年前 来自 问答

用node的tcp client在发送数据,一般是用client.write('send','utf-8'); 这样如果想发100条数据,只需:

for(var i=0;i<100;i++){
	client.write('send','utf-8')
}

但这样的话,在服务端只会收到一条数据,类似于:

received client: sendsendsendsend ....

所以,要怎样让client发数据的时候不是一块儿发,而真正的做到一条一条的发,这样服务端就可以逐一的去处理这些数据了。

8 回复

这个?socket.end 但这样每次要重连了

如果不想重连的话,就自己设定个格式,拿到之后分析吧。

@booxood socket.end 不建议在这个环境下使用。

定格式这种方式目前在用。不过还是有问题。 有一种情况,node会有一个默认的bufferSize,当数据到了这个size之后才会去发一个包。 这种情况下,添加格式,比如 client.write('send'+'|--end--|'), 当我同时write了1000条数据,你想要的结果可能是: sendsend....(1000个) 但是实际的结果会是: sendsend...se并没有1000,或许第500个的时候,截取了send的一部分。node就这样打了个包,发出去了。 所以,如何优化?

setNoDelay试试

@sinsupakaka

已试,貌似没用。

@myhirra

试试nssocket这个模块,它把自定义格式的消息(消息头和消息体)封装在一个Buffer中,然后用底层的TCP/TLS socket发送出去。看看是否能满足你的要求。

@myhirra 优化?优化什么?没明白。。。

是想拿全部数据再解析?可以监听end事件

在循环里面中,io根本拿不到执行的机会。。。

@booxood

监听end事件要client.end()才行。

回到顶部