-1

Java のネットワーキングと io について学習しているので、さまざまなチュートリアルで読んでいることを適用するクライアント/サーバー アプリをゆっくりと構築しています。私は困惑していますが、コードが長い間機能しない理由を理解しようとしています。だから私はSOの無限の知恵に目を向けることにしました:)

localhost からのクライアント ソケット接続を受け入れた後、サーバーに次のように表示されます。

BufferedInputStream in = new BufferedInputStream(socket.getInputStream(),Config.BUFFER_SIZE_NET);
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream(),Config.BUFFER_SIZE_NET);
String msg = "";
byte buffer[] = new byte[Config.BUFFER_SIZE_READ];
int bytesRead;
System.out.println("Server is waiting for data");
while ((bytesRead = in.read(buffer)) > 0) {
    msg = msg + new String(buffer,Config.CHARSET);
}
System.out.println("Server received: "+msg);

サーバーに接続した後、JButton を押すと、これがクライアントで実行されます。

BufferedInputStream in = new BufferedInputStream(socket.getInputStream(),Config.BUFFER_SIZE_NET);
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream(),Config.BUFFER_SIZE_NET);
String msg = "msg";
try{
    out.write(msg.getBytes(Config.CHARSET));
    out.flush();
    System.out.println("Client sent: "+msg);
}catch(Throwable e){e.printStackTrace();}

クライアントのボタンを押すと、次の出力が得られます。

Client sent: msg

サーバー側では、次のようになります。

Server is waiting for data

サーバーをデバッグすると、次の行で永久にブロックされていることがわかります。

while ((bytesRead = in.read(buffer)) > 0) {

例外はスローされません。ここで何が欠けていますか?以前は動作していましたが、多くの変更を行ったため、元に戻すことができません。

注: これは、レビューしやすいように、実際のコードをわずかに変更したバージョンです。関連するものが不足していると思われる場合は、お知らせください。

4

1 に答える 1

0

自分で掘った穴から出ました。受信したデータの最後をチェックしていなかったことが判明したため、コードは読み取りをブロックしているか、その後のループでスタックしていました。while ループ内で、サーバーによって読み取られたデータ内の特定のバイト シーケンスをチェックすることで、データの末尾を特定し、ループから抜け出すことができました。

これが上記の問題に対する(最も)正しい答えかどうかはわかりませんが、この方法で解決したので、回答として送信します。

于 2012-12-23T20:21:39.090 に答える