java tcp 拆分,Erlang服务器,Java客户端-TCP消息被拆分了吗?

博主遇到一个问题,即Erlang编写的服务器在接收Java客户端通过TCP发送的消息时,无法正确识别“完成”消息,导致消息被拆分成多个部分。当Erlang客户端与Erlang服务器通信时,消息传递正常。博主推测可能需要在消息中添加分隔符,但未找到满意的解决方案。寻求帮助如何在Java端解决这个问题。
摘要由CSDN通过智能技术生成

如标题所示,我有一个用Erlang编写的服务器,一个用Java编写的客户端,它们通过TCP进行通信。我面临的问题是gen_tcp:recv显然不知道何时从客户端接收到“完成”消息,因此正在将其“拆分”为多个消息。

这是我正在做的一个示例(代码不完整,试图将其仅保留在相关部分中):

Erlang服务器

-module(server).

-export([start/1]).

-define(TCP_OPTIONS, [list, {packet, 0}, {active, false}, {reuseaddr, true}].

start(Port) ->

{ok, ListenSocket} = gen_tcp:listen(Port, ?TCP_OPTIONS),

accept(ListenSocket).

accept(ListenSocket) ->

{ok, Socket} = gen_tcp:accept(ListenSocket),

spawn(fun() -> loop(Socket) end),

accept(ListenSocket).

loop(Socket) ->

case gen_tcp:recv(Socket, 0) of

{ok, Data} ->

io:format("Recieved: ~s~n", [Data]),

loop(Socket);

{error, closed} ->

ok

end.

Java客户端

public class Client {

public static void main(String[] args) {

Socket connection = new Socket("localhost", Port);

DataOutputStream output = new DataOutputStream(connection.getOutputStream());

Scanner sc = new Scanner(System.in);

while(true) {

output.writeBytes(sc.nextLine());

}

}

}

结果

客户

Hello!

服务器

Received: H

Received: el

Received: lo!

我一直在搜索,如果我对它的理解正确,TCP不知道消息的大小,因此您需要手动设置某种分隔符。

我没有得到的是,如果我改为使用Erlang编写客户端,则消息似乎永远不会分裂,就像这样:

Erlang客户端

-module(client).

-export([start/1]).

start(Port) ->

{ok, Socket} = gen_tcp:connect({127,0,0,1}, Port, []),

loop(Socket).

loop(Socket) ->

gen_tcp:send(Socket, io:get_line("> ")),

loop(Socket).

结果

客户

Hello!

服务器

Received: Hello!

这使我想知道它是否可以在Java端固定?我已经尝试了服务器端不同输出流,写入方法和套接字设置的几种组合,但是没有任何方法可以解决问题。

此外,网络上有很多Erlang(聊天)服务器示例,它们不做任何定界符,尽管这些示例通常在两端都是用Erlang编写的。但是,他们似乎假定已像发送消息一样接收消息。这仅仅是不好的做法,还是用Erlang编写客户端和服务器时是否存在一些有关消息长度的隐藏信息?

如果必须进行定界符检查,令我惊讶的是我找不到关于此主题的太多信息。如何以实用的方式完成?

提前致谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值