
您需要在服务器和客户端之间定义协议,以将TCP流拆分为消息。TCP流分为数据包,但不能保证这些数据包与您的发送/写入或接收/读取调用相匹配。
一个简单而强大的解决方案是为所有消息添加一个长度前缀。Erlang可以使用
{packet,1|2|4}选项透明地执行此 *** 作,其中前缀以1、2或4个字节编码。您将必须在Java端执行编码。如果选择2或4个字节,请注意长度应以big-endian格式编码,
DataOutputStream.outputShort(int)与
DataOutputStream.outputInt(int)java方法使用的字节顺序相同。
但是,从您的实现看来,您确实有一个隐式协议:您希望服务器单独处理每一行。
幸运的是,Erlang也对此进行了透明处理。您只需要传递
{packet,line}选项。但是,您可能需要调整接收缓冲区,因为该缓冲区将被截断更长的行。这可以通过{recbuf, N}选项来完成。因此,只需重新定义选项即可完成您想要的 *** 作。
-define(MAX_LINE_SIZE, 512).-define(TCP_OPTIONS, [list, {packet, line}, {active, false}, {reuseaddr, true}, {recbuf, ?MAX_LINE_SIZE}].欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)