当前位置: 首页 > 知识库问答 >
问题:

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

充运浩
2023-03-14

所以我有一个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");
    }
}

但当它读取所有字节时,在。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!#");
}

共有2个答案

郗俊能
2023-03-14

我同意斯特凡诺的观点。PHP服务器端没有EOF或终止信号。socket_write只是向客户端写入$消息。如果您的意图是在整个消息写完后终止连接,那么您可能必须显式地使用socket_shutdown/socket_close。

你也可以尝试用旗帜socket_send。这是http://www.php.net/manual/en/function.socket-send.php的医生

公羊曜灿
2023-03-14

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

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

因此,我认为您需要发送一个终止字符序列,或者发送的字符数,以便在客户端识别数据流中数据块(消息)的边界。

 类似资料:
  • socket_read和socket_recv之间有什么区别?我正在尝试使用PHP套接字,但使用socket_read时收到了以下警告: 请帮帮我!

  • 问题内容: 这就是我到目前为止 我的代码存在问题,返回null。 当我打印对象的内容时,我得到的是标题部分 后面跟着一个空行以及许多带有不同字符的行,例如。 再次我的问题是函数返回null。 提前致谢。 问题答案: 为什么不想使用简单的HTTP URL从主机获取图像?我的意思是: 如果要使用普通套接字,则必须解析http响应并手动从http答复中提取数据:读/跳过标头,读取二进制数据并将其传递给(

  • 问题内容: 我有一个侦听某些x端口的套接字。 我可以从客户端应用程序将数据发送到套接字,但是无法从服务器套接字获得任何响应。 ..此代码部分从服务器读取数据。 但是,直到关闭服务器上的套接字,我才能从服务器读取任何内容。服务器代码不受我控制,无法对其进行编辑。 如何从客户端代码中克服这个问题。 谢谢 问题答案: 为了在客户端和服务器之间进行通信,必须明确定义协议。 客户端代码将阻塞,直到从服务器收

  • 问题内容: 我在我的项目之一中使用Java.net。我写了一个从客户端获取inputStream的App Server。但是有时我的(缓冲的)InputStream无法获得客户端发送到我的服务器的所有OutputStream。我该如何写一个等待或类似的东西,让我的InputStream获得客户端的所有OutputStream? (我的InputStream不是字符串) 谢谢。 问题答案: 例如,你

  • 我在我的一个项目中使用Java.net。我写了一个从客户端获取输入流的应用服务器。但是有时候我的(缓冲的)输入流不能得到客户端发送到我的服务器的所有输出流。我怎么能写一个等待或类似的东西,我的输入流得到客户端的所有输出流? (我的输入流不是字符串) 谢谢。

  • 问题内容: 我试图呼吁一个非常繁重的过程。平均工作时间估计为9-10分钟。 当我执行该过程时,我为一个巨大的数字设置了超时时间:99999999。 2分钟后,出现以下错误: java.net.SocketTimeoutException:读取超时 我尝试对其进行更多处理,并将超时设置为3000,并且在预期的3秒钟后出现了相同的错误。 您对为什么将其设置为最大120000 有任何想法吗? 问题答案: