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

标签 java php sockets

所以。我有一个 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/

相关文章:

java - 不可修改集合中的 ConcurrentModificationException

java - JDBC select where 查询问题

php - mySQLi 准备失败,多个?从形式

Java 套接字 - 本地端口

java - TypeElement 与 TypeMirror 作为 Java 注释处理器的数据模型

java - 我可以包装多个 Java 排序集,使它们看起来像一个吗?

php - 向用户显示他已注销

javascript - jQuery DataTable 显示条目、搜索框和排序不起作用?

c++ - 将 UDP 数据包发送到同一地址的效率

c++ - 在没有 SO_LINGER > 0 的情况下强制关闭服务器端套接字会丢失数据,对吗?