0

DataOutput ストリームを使用してバイトに変換された文字列を送信しています

// creates a client socket which connects to the first successor's server.
Socket clientSocket = new Socket(host, succ1_port);

// send the output_string to the first successor.
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
outToServer.writeBytes(output_string);

次に、SocketChannel を介してそれらを受信します。

// accept connection
SocketChannel connectionSocket = tcpserver.accept(); // tcpserver is a ServerSocketChannel

ByteBuffer buf = ByteBuffer.allocate(48);

// store and print no. of bytes read
int bytes_read = connectionSocket.read(buf);
System.out.println("bytes read = " +bytes_read);
String from_client_string = new String(buf.array(), Charset.forName("UTF-8"));

受信したメッセージは常に「XXXX XXX」の形式で、X は 0 ~ 9 の任意の数字です。

次に、これらのメッセージを 2 つの部分に分けてみます。

Pattern p = Pattern.compile("([0-9]{4}) ([0-9]{3})"); 
Matcher m = p.matcher(from_client_string);

if (m.matches()){   
  int filename = Integer.parseInt(m.group(1));
  int hash = Integer.parseInt(m.group(2));
  System.out.println("filename = " +filename);
  System.out.println("hash = " +hash);
else
  System.out.println("no match");   

問題は、bytebuffer から変換された文字列を出力すると、値が変わってしまうことがあるということです... 通常は "1234 210" のように正しいのですが、場合によっては 1 桁を切り取って "1234 21" と表示することがあります。しかし、それが正しい場合でも、一致しませんか? また、読み取られるバイト数が常に変化することもわかりました...

ここで何が問題なのか誰にもわかりませんか?

ご協力いただきありがとうございます。

4

3 に答える 3

1

ByteBuffer を使用して読み取ると、使用可能なバイト数が得られますが、これは書き込んだすべてのバイトではない可能性があります。DataInputStream.readUTF() が行うことは、長さ (16 ビットの符号なし値) をデコードするために必要なバイト数を待機することです。

DataOutputStream.writeUTF(String)とを使用することをお勧めしますString DataInputStream.readUTF()。バッファリングの使用も検討することをお勧めします。

于 2013-04-11T07:39:17.450 に答える
1

ソケットが閉じられるまで、ループ内でソケットから読み取り続ける必要があります。使用可能なバイトがない場合、読み取りはブロックされるため、相手側の接続を閉じていることを確認してください。

だからクライアント側で

// creates a client socket which connects to the first successor's server.
Socket clientSocket = new Socket(host, succ1_port);

// send the output_string to the first successor.
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
outToServer.writeBytes(output_string);
outToServer.close();
clientSocket.close();

サーバー側で:

// accept connection
SocketChannel connectionSocket = tcpserver.accept(); // tcpserver is a ServerSocketChannel

ByteBuffer buf = ByteBuffer.allocate(48);

// store and print no. of bytes read
String result="";
while(connectionSocket.isOpen()){
  int bytes_read = connectionSocket.read(buf);
  System.out.println("bytes read = " +bytes_read);
  String from_client_string = new String(buf.array(),0,bytes_read Charset.forName("UTF-8"));
  reulst+= from_client_string;

} }

于 2013-04-11T02:48:17.320 に答える