gpt4 book ai didi

java - 在 Java 套接字之上编写协议(protocol)的问题

转载 作者:行者123 更新时间:2023-11-29 08:17:35 24 4
gpt4 key购买 nike

我正在套接字之上编写一个协议(protocol),因此我决定实现 header 然后发送信息。因此,服务器上的每个连接都有一个线程,该线程坐在那里读取 header ,然后委托(delegate)方法在信息到达时读取其余信息。

所以基本上它看起来像这样:

while ((length = inStream.read(buffer)) != -1)
{
dispatch(buffer, length);
}

因此,dispatch 方法随后会解密 header 并根据在 header 中找到的内容委托(delegate)该方法。它看起来类似于:

byte[] clearText = decrypt(message,length);
if (cleartext == foo) sendFooToSocket();

然后 sendFooToSocket() 将坐在那里并从 instream 读取或发送到 outstream。这是我似乎遇到一些问题的地方,在客户端中我发送 header 然后刷新,然后发送其余数据,但看起来它们都是一体的,而不是被拆分为 header 然后是数据。还有强制退出 sendFooToSocket 方法的最佳方法吗?

public void sendFooToSocket()
{
byte[] buffer = new byte[1024];
int length = 0;
while ((length = inStream.read(buffer) >0)
{
message = decrypt(buffer, length);
}
}

我假设 flush 允许我在关闭然后打开流时中断此方法?

所以我有 2 个问题,flush 似乎没有分解我的消息,而且 flush 似乎不允许退出诸如 sendFooToSocket() 之类的方法,有什么建议吗?

为了清楚起见,客户端只是这样做:

byte[] header = "MESG".getBytes();
cipher = encrypt(header);
outStream.write(cipher,0,cipher.length);
outStream.flush();
byte[] message = "Hi server".getBytes();
cipher = encrypt(message);
outStream.write(cipher,0,cipher.length);
outStream.flush();

但是,即使在每次写入后它都被刷新,服务器仍将其作为 1 条消息接收。仅发送 header 有效,我们陷入了 sendFooToSocket() 方法,但如果我在刷新后发送数据,它会立即完成。

客户端使用来自 socket.get 的 OutputStream 和 InputStreams。客户端还使用 OutputStream 和 InputStream。不确定这是否重要?

最佳答案

您似乎想要的是“记录边界”。对于流,通常没有隐式记录边界。如果您想要那种功能,您将需要自己实现它,方法是缓冲输入并寻找换行符来指示记录的结尾。

查看 BufferedInputStream。

关于java - 在 Java 套接字之上编写协议(protocol)的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3392696/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com