3

私は Java ソケットから始めていますが、奇妙な出力が [不足しています]。ソケットメソッドのソースは次のとおりです。

クライアントのソース コード:

public void loginToServer(String host, String usnm ) {
    try {
        Socket testClient = new Socket(host,1042);
        System.out.println ("Connected to host at " + host);
        logString = ("CONNECTED: " + host);
        outGoing = new PrintWriter(testClient.getOutputStream(), true);
        outGoing.print("Hello from " + testClient.getLocalSocketAddress());
        InputStream inFromServer = testClient.getInputStream();
        DataInputStream in = new DataInputStream(inFromServer);
        System.out.println("Server says " + in.readLine());
        testClient.close();
    }
    catch (Exception e) {
        System.err.println ("Error connecting to host at " + host + ":1042.\n Reason: " + e);
        logString = ("CONNECT FAILED: " + host + ":1042: " + e);
    }
    printLog(logString);
    // send server usnm and os.name [System.getProperty(os.name)] ?
}

そしてサーバーコード:

public void runServer() {
        try{
            server = new ServerSocket(1042); 
        }
        catch (IOException e) {
            printLog("LISTEN FAIL on 1042: " + e);
            System.err.println("Could not listen on port 1042.");
            System.exit(-1);
        }
        try{
            client = server.accept();
        }
        catch (IOException e) {
            printLog("ACCEPT FAIL on 1042: " + e);
            System.err.println("Accept failed: 1042");
            System.exit(-1);
        }
        try{
            inComing = new BufferedReader(new InputStreamReader(client.getInputStream()));
            outGoing = new PrintWriter(client.getOutputStream(), true);
        }
        catch (IOException e) {
            printLog("READ FAIL on 1042: " + e);
            System.err.println("Read failed");
            System.exit(-1);
        }
        while(true){
            try{
                clientData = inComing.readLine();
                //processingUnit(clientData, client);
                outGoing.print("Thank you for connecting to " + server.getLocalSocketAddress() + "\nGoodbye!");
            }
            catch (IOException e) {
            printLog("READ FAIL on 1042: " + e);
                System.out.println("Read failed");
                System.exit(-1);
            }
        }
    }

そして、クライアントが提供した出力は単にConnected to host at localhost.

どうしたの?

4

2 に答える 2

2

行を読んでいますが、行を送信していません。に変更print()println()ます。readLine()改行を待って永久にブロックします。ストリームの最後、つまりピアが接続を閉じたときに null を返しますが、それもチェックしていないため、無期限にループしています。

于 2012-06-01T04:53:42.697 に答える
2

テキストを書き、バイナリを読んでいます。出力と入力が一致しないため、この場合はハングする可能性が高くなります。

writeUTF/readUTF でバイナリを使用するか、println/readLine でテキストを使用することをお勧めします。

ところで: readUTF は 2 バイトを読み取り、読み取るデータの長さを決定します。最初の 2 バイトは ASCII テキストであるため、戻る前に約 16,000 文字を待機する可能性があります。

于 2012-05-31T16:12:33.457 に答える