1

私は現在、ソケットを開き、それを介してデータを送受信する必要があるJavaでアプリを作成しています。

バッファが空になると BufferedReader.readLine() が null を返すことは私の理解です。ただし、私のコードは、BufferedReader から行を読み取るループから終了しません。アイデアは、曲のリストを受け取り、曲の再生を開始するサーバーに値を送信することです。

これはコードです:

package me.frankvanbever.MediaServerClient;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

        public class MediaServerClient {

            /**
             * @param args
             */
            public static void main(String[] args) {

                    Socket server;
                    try {
                        server = new Socket( "10.42.0.41" , 2626 );

                        InputStream in = server.getInputStream();
                        OutputStream out = server.getOutputStream();

                        BufferedReader bin = new BufferedReader( new InputStreamReader( in ) , 4096);

                        String inputline;
                        while( (inputline = bin.readLine()) != null){

                            System.out.println(inputline);

                        }

                        System.out.println("exited loop");
                        out.write('1');
                    } catch (UnknownHostException e) {
                    } catch (IOException e) {
                    }


            }

    }

これは正常な動作ですか?サーバーは Python で書かれており、ソース コードを変更できます。

4

1 に答える 1

6

バッファが空になると BufferedReader.readLine() が null を返すことは私の理解です。

いいえ。null原資産の返品がクローズされた時点で返品されます。接続しているサーバーが接続を閉じない場合BufferedReader、次のテキスト行を待つだけでハングします。

TCP はストリーム指向であることを忘れないでください (そのままBufferedReader)。プロトコルに含めない限り、「完全なメッセージ」の兆候はありません。そのため、多くの場合、プロトコルにはメッセージ ターミネータなどを含めたり、メッセージを送信する前にメッセージ内のデータ量を指定したりします。

于 2013-05-05T11:46:26.900 に答える