サーバーでは、Javaソケットを介してクライアントにバイト配列を送信しました
byte[] message = ... ;
DataOutputStream dout = new DataOutputStream(client.getOutputStream());
dout.write(message);
クライアントからこのバイト配列を受信するにはどうすればよいですか?
これを試してください、それは私のために働いています。
送信者:
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
}
まず、本当に必要でない限り、DataOutputStream
を使用しないでください。第二:
Socket socket = new Socket("Host", port);
OutputStream socketOutputStream = socket.getOutputStream();
socketOutputStream.write(message);
もちろん、これにはエラーチェックはありませんが、これでうまくいくはずです。 JDK API Javadoc はあなたの友人であり、あなたを大いに助けることができます。
JDKソケットチュートリアル here があり、サーバーとクライアントの両方をカバーしています。それはまさにあなたが望むものに似ています。
(そのチュートリアルから)これは、エコーサーバーから読み取るように設定します。
echoSocket = new Socket("taranis", 7);
out = new PrintWriter(echoSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(
echoSocket.getInputStream()));
バイトのストリームを取得し、リーダーを介してデフォルトのエンコーディングを使用して文字列に変換します(通常はお勧めできません)。
エラー処理およびソケット/ストリームのクローズは上記から省略されていますが、チュートリアルを確認してください。
メッセージを固定サイズにするか、サイズを送信するか、いくつかの区切り文字を使用する必要があります。
これは、既知のサイズ(100バイト)の最も簡単なケースです。
_in = new DataInputStream(server.getInputStream());
byte[] message = new byte[100]; // the well known size
in.readFully(message);
_
この場合、DataInputStream
はreadFully()
を提供するので理にかなっています。使用しない場合は、予想されるバイト数が読み取られるまでループする必要があります。