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

时间:2014-01-20 07:52:46

标签: 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!#");
}

2 个答案:

答案 0 :(得分:0)

如果您的插座仍然打开,我相信读取将永远不会重新开启-1。您不关闭trasmission(就文件而言,未达到EOF)。我相信当您的消息结束时(而不是-1),您的读取调用返回0.

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

所以我相信你需要发送一个终止字符序列,或者你要发送的字符数,以便在客户端识别数据流中你的数据块(消息)的边界。 / p>

答案 1 :(得分:0)

我同意斯特凡诺的观点。在php服务器端没有发生EOF或终止信号。 socket_write只是向客户端写入$ message。如果您的目的是在写完整条消息后终止连接,那么您可能必须明确使用socket_shutdown / socket_close。

您也可以尝试使用带有标志的socket_send。以下是http://www.php.net/manual/en/function.socket-send.php

的文档
相关问题