2012-06-11 2 views
4

Я пытаюсь написать свой первый сервер сокетов, поэтому решил начать с чего-то очень простого, чтобы просто понять поток :) Я пишу простой Java-сервер эха, но вещь что (по какой-то причине ?!) Я не получаю ответ сервера в клиенте, хотя запрос получен на сервере.Простая проблема эхо-сервера 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 основных сокетов учебников/и т.д., но я просто не могу понять, что это неправильно - я успешно писать в сокет сервера, но я похоже, не могут получить ответ.

+2

Вы не должны игнорировать исключения. Это похоже на попытку водить машину с завязанными глазами. –

+0

Я не вижу нигде в вашем серверном коде, где вы получаете IP-адрес клиента. – Chad

+0

@HovercraftFullOfEels, как предложено именем пакета, это PoC, а не реальный код. Спасибо за совет. – asenovm

ответ

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(); 

В соответствии с Javadoc близкого() метод:

Закрывает поток и освобождает все системные ресурсы, связанные с его. Закрытие ранее закрытого потока не влияет.

Похоже, что если вы закрываете поток, базовая розетка также закрывается. Вы можете проверить это, распечатав трассировку стека в текущем коде. Он дает ошибку java.net.SocketException: socket closed.

+0

omg, я такой глупый, 10x. – asenovm

0

Попробуйте вместо этого:

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

отметить также, что нет необходимости в writer.flush();, так как вы делаете это авто смыва потока при передаче true ко второму параметру PrintWriter конструктора.

+0

:/Спасибо за флеш-заметку, просто хотел убедиться, что это не из-за того, что вы не смываете поток. Я могу писать на серверный сокет (если я зарегистрирую reader.readLine() на сервере, это даст правильный результат, поэтому сокет будет правильно создан. Я не могу получить ответ - клиент прекращается после отправки запрос – asenovm

+0

@asenovm Возвращает ли он метод 'readLine()' в 'System.out.println (reader.readLine());', то есть печатает ли что-нибудь на консоли? –

+0

нет, это не - вот в чем проблема: \ – asenovm

Смежные вопросы