4

私は最初のソケットサーバーを作成しようとしているので、フローを把握するためだけに非常に単純なものから始めることにしました:)単純なJavaエコーサーバーを作成していますが、それは(何らかの理由で?! ) リクエストはサーバーで受信されますが、クライアントでサーバーのレスポンスが得られません。

package poc.client;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class Client {
    public static void main(String[] args) {
        try {
            final Socket socket = new Socket((String) null, 50000);

            final BufferedReader reader = new BufferedReader(
                    new InputStreamReader(socket.getInputStream()));
            final PrintWriter writer = new PrintWriter(
                    socket.getOutputStream(), true);
            writer.println("ala bala\r\n");
            writer.flush();
            writer.close();

            System.out.println(reader.readLine());
            System.out.flush();
        } catch (Exception ex) {
                Logger.getAnonymouseLogger().throwing(TAG, "main", ex);
        }

    }
}

そしてサーバー部分は

package poc.server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    /**
     * debugging purposes only
     */
    @SuppressWarnings("unused")
    private static final String TAG = Server.class.getSimpleName();

    public static void main(String[] args) {
        try {
            final ServerSocket socket = new ServerSocket(50000);
            while (true) {
                final Socket clientSocket = socket.accept();
                final BufferedReader reader = new BufferedReader(
                        new InputStreamReader(clientSocket.getInputStream()));
                final PrintWriter writer = new PrintWriter(clientSocket
                        .getOutputStream(), true);

                writer.println(reader.readLine());
                writer.flush();
                writer.close();
            }
        } catch (IOException e) {
                Logger.getAnonymouseLogger().throwins(TAG, "main",ex);
        }

    }
}

Oracle の基本的なソケット チュートリアルなどをすべて読みましたが、何が問題なのかわかりません。サーバー ソケットへの書き込みは成功していますが、応答を取得できないようです。

4

2 に答える 2

2

ソケットから読み取る前にライターを閉じないでください。次のコードは動作します

final Socket socket = new Socket((String) null, 50000);

            final BufferedReader reader = new BufferedReader(
                    new InputStreamReader(socket.getInputStream()));
            final PrintWriter writer = new PrintWriter(
                    socket.getOutputStream(), true);
            writer.println("ala bala\r\n");

            System.out.println(reader.readLine());            
            //writer.flush();
            writer.close();

close() メソッドの javadoc によると:

ストリームを閉じ、それに関連付けられているすべてのシステム リソースを解放します。以前に閉じたストリームを閉じても効果はありません。

ストリームを閉じると、基になるソケットも閉じられるように見えます。これは、現在のコードでスタック トレースを出力することで確認できます。エラーが発生しjava.net.SocketException: socket closedます。

于 2012-06-11T21:37:08.573 に答える
0

代わりにこれを試してください:

Socket socket = new Socket(InetAddress.getLocalHost(), 50000);

また、コンストラクターの2番目のパラメーターにwriter.flush();渡すときに、自動フラッシュストリームにするため、必要がないことにも注意してください。truePrintWriter

于 2012-06-11T19:38:18.750 に答える