web-dev-qa-db-ja.com

ソケット送受信バイト配列

サーバーでは、Javaソケットを介してクライアントにバイト配列を送信しました

byte[] message = ... ;

DataOutputStream dout = new DataOutputStream(client.getOutputStream());
dout.write(message);

クライアントからこのバイト配列を受信するにはどうすればよいですか?

23
quan

これを試してください、それは私のために働いています。

送信者:

byte[] message = ...
Socket socket = ...
DataOutputStream dOut = new DataOutputStream(socket.getOutputStream());

dOut.writeInt(message.length); // write length of the message
dOut.write(message);           // write the message


受信機:

Socket socket = ...
DataInputStream dIn = new DataInputStream(socket.getInputStream());

int length = dIn.readInt();                    // read length of incoming message
if(length>0) {
    byte[] message = new byte[length];
    dIn.readFully(message, 0, message.length); // read the message
}
60
franta kocourek

まず、本当に必要でない限り、DataOutputStreamを使用しないでください。第二:

Socket socket = new Socket("Host", port);
OutputStream socketOutputStream = socket.getOutputStream();
socketOutputStream.write(message);

もちろん、これにはエラーチェックはありませんが、これでうまくいくはずです。 JDK API Javadoc はあなたの友人であり、あなたを大いに助けることができます。

8
Bombe

JDKソケットチュートリアル here があり、サーバーとクライアントの両方をカバーしています。それはまさにあなたが望むものに似ています。

(そのチュートリアルから)これは、エコーサーバーから読み取るように設定します。

    echoSocket = new Socket("taranis", 7);
    out = new PrintWriter(echoSocket.getOutputStream(), true);
    in = new BufferedReader(new InputStreamReader(
                                echoSocket.getInputStream()));

バイトのストリームを取得し、リーダーを介してデフォルトのエンコーディングを使用して文字列に変換します(通常はお勧めできません)。

エラー処理およびソケット/ストリームのクローズは上記から省略されていますが、チュートリアルを確認してください。

3
Brian Agnew

メッセージを固定サイズにするか、サイズを送信するか、いくつかの区切り文字を使用する必要があります。

これは、既知のサイズ(100バイト)の最も簡単なケースです。

_in = new DataInputStream(server.getInputStream());
byte[] message = new byte[100]; // the well known size
in.readFully(message);
_

この場合、DataInputStreamreadFully()を提供するので理にかなっています。使用しない場合は、予想されるバイト数が読み取られるまでループする必要があります。

1
eckes