簡體   English   中英

如何從Java中的字節流讀取(PHP / Java套接字通信)

[英]How to read from byte stream in Java (PHP/Java socket communication)

所以。 我有一個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!#");
}

如果您的套接字仍然打開,我相信讀操作將永遠不會恢復-1。 您不關閉傳輸(就文件而言,未達到EOF)。 我相信您的消息結束時,您的read調用返回0(而不是-1)。

Java文檔:讀取返回:*已讀取指定的字節數,*基礎流的read方法返回-1,表示文件結束,或者*基礎流的可用方法返回零,表示進一步輸入請求將被阻止。

因此,我認為您需要發送一個終止字符序列或要發送的字符數,以便在客戶端識別出數據流中數據塊(消息)的邊界。

我同意斯特凡諾。 php服務器端未發生EOF或終止信號。 socket_write只是將$ message寫入客戶端。 如果您的意圖是在寫完整個消息后終止連接,則可能必須顯式使用socket_shutdown / socket_close。

您也可以嘗試使用帶有標志的socket_send。 這是該http://www.php.net/manual/zh/function.socket-send.php的文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM