gpt4 book ai didi

java - 如何在Java中读取字节流(PHP/Java套接字通信)

转载 作者:太空宇宙 更新时间:2023-11-04 15:12:01 24 4
gpt4 key购买 nike

所以。我有一个 PHP 套接字服务器和 Java 套接字客户端。
也许这是一个愚蠢的问题......但我没有找到答案。
在客户端中,我需要从输入流读取传入的字节并将它们放入字节数组中。
我尝试这样做:

[客户端(Java)]

public static byte[] read(BufferedInputStream in)
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[32768];
while (true) {
int readBytesCount = in.read(buffer);
if (readBytesCount == -1) {
break;
}
if (readBytesCount > 0) {
baos.write(buffer, 0, readBytesCount);
}
}
baos.flush();
baos.close();
return baos.toByteArray();
}

[服务器 (PHP)]

function write(&$client, $message)
{
$message = explode("\n", $message);
foreach ($message as $line)
{
socket_write($client['sock'], $line."\0");
}
}

但是当它读取所有字节时,in.read() 不会返回-1,因此循环不会停止。有一次它返回 13(长度),然后就什么也没有了。有什么想法吗?

解决了!
[客户端(Java)]

ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[32768];
while (true) {
int readBytesCount = in.read(buffer);
if (getString(buffer).contains("#!EOS!#")) {
baos.flush();
baos.close();
return baos.toByteArray();
}
if (readBytesCount > 0) {
baos.write(buffer, 0, readBytesCount - 1);
}
}

[服务器 (PHP)]

function write(&$client, $message)
{
$message = explode("\n", $message);
$message = str_replace("\r", "", $message);
foreach ($message as $line)
{
rLog("Write to ".$client['ip'].": ".$line);
socket_write($client['sock'], $line."\0") or die("[".date('Y-m-d H:i:s')."] Could not write to socket\n");
}
socket_write($client['sock'], "#!EOS!#");
}

最佳答案

如果你的套接字仍然打开,我相信 read 永远不会重新调整 -1。您没有关闭传输(就文件而言,未达到 EOF)。我相信当您的消息结束时,您的 read 调用会返回 0 (而不是 -1 )。

Java 文档:读取返回值:* 已读取指定数量的字节,* 底层流的read方法返回-1,表示文件结束,或者* 底层流的available方法返回零,表示进一步的输入请求将被阻塞。

所以我相信您需要发送一个终止字符序列,或者您将发送的字符数,以便在客户端识别数据流内数据 block (消息)的边界。

关于java - 如何在Java中读取字节流(PHP/Java套接字通信),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21228716/

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