Server и ServerSocket в одном приложении: не работает - PullRequest
0 голосов
/ 18 октября 2011

Я пытаюсь написать небольшую программу, которая открывает сервер, создает клиента, который подключается к этому серверу и получает от него сообщение.

Это код на данный момент

public static void main(String[] args) {
final ServerSocket serverSocket;
try {
    serverSocket = new ServerSocket(12345);
    Thread t = new Thread(){
        public void run(){
                try {
                    Socket server = serverSocket.accept();
                    PrintWriter writer = new PrintWriter(server.getOutputStream(), true);
                    writer.write("Hello World");
                    writer.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };
        t.start();
        Socket client = new Socket("localhost", 12345);
        BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
        String message = reader.readLine();

        System.out.println("Received " + message);
    } catch (IOException e1) {
        e1.printStackTrace();
    }

}

Если я запускаю программу, она продолжает ждать в readLine () - так что, очевидно, клиент не получает сообщение от сервера. Кто-нибудь понял, почему это не работает?

Ответы [ 2 ]

3 голосов
/ 18 октября 2011

Ваш поток чтения ожидает новой строки в потоке данных.Просто измените сервер на:

writer.write("Hello World\r\n");

, и вы получите ожидаемый результат.Кроме того, вы можете просто закрыть сокет сервера, и тогда readLine вернется, когда достигнет конца потока данных.

0 голосов
/ 18 октября 2011

Вы должны поместить readline в цикл следующим образом:

public static void main(String[] args) {
    final ServerSocket serverSocket;
    try {
        serverSocket = new ServerSocket(12345);
        Thread t = new Thread() {
            public void run() {
                try {
                    Socket server = serverSocket.accept();
                    PrintWriter writer = new PrintWriter(server.getOutputStream(), true);
                    writer.write("Hello World");
                    writer.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };
        t.start();
        Socket client = new Socket("localhost", 12345);
        BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
            // Check this --------------------------------------------------->
            String message = null;
            while ((message = in.readLine()) != null) {   
                    System.out.println("Received " + message);
                    break; //This break will exit the loop when the first message is sent by the server
            }

    } catch (IOException e1) {
        e1.printStackTrace();
    }

}

Вы можете прочитать эту документацию для дальнейшего объяснения: http://download.oracle.com/javase/tutorial/networking/sockets/

...