0

TCP/IP ソケットからテキスト行を取得するために BufferedReader#readLine() を使用しています。

同じセッション中に、サーバーが \r\n で終了する行を送信することもあれば、\n だけで終了する行を送信することもあります。

この動作は私の管理下にありません:(

readLine() の Javadoc には次のように書かれています。

「行は、ライン フィード ('\n')、キャリッジ リターン ('\r')、またはキャリッジ リターンの直後のラインフィードのいずれかによって終了すると見なされます。」

残念ながら、それはうまくいかないようです (少なくとも Windows では)。\r\n で終わる行を読み取ることだけを「認識」します。

なにか提案を?

前もって感謝します、エイドリアン。

4

2 に答える 2

1

シンプルなソケット クライアントを作成し、netcat サーバーに対してテストしました。問題は、netcat サーバーが常に UTF-8 で送信し、クライアントがたとえば UTF-16 を期待できないことです。

クライアントコードは次のとおりです。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.UnknownHostException;

public class LineReader {

    /**
     * @param args
     */
    public static void main(String[] args) {
        if (args.length < 2) {
            System.out.println("usage: java LineReader charset url");
            System.exit(1);
        }

        try {
            final String charset = args[0];
            final URI url = new URI(args[1]);
            final String host = url.getHost();
            final int port = url.getPort();
            final Socket socket = new Socket(host, port);
            final BufferedReader reader = new BufferedReader(
                    new InputStreamReader(socket.getInputStream(), charset));
            while (true) {
                final String line = reader.readLine();
                System.out.println(line);
            }
        } catch (URISyntaxException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

結論: readLine メソッドに問題はありません。

于 2012-01-02T22:12:59.130 に答える
0

基盤となる OS の line.separator プロパティを使用してみてください: 次のように実行できます。

static final String lineSeparator = System.getProperty ( "line.separator" );
于 2012-01-01T16:05:30.613 に答える