2010-09-29 2 views
0

Это простой клиент-сервер, где Сервер с использованием объекта BufferedWriter отправил бы Клиент принимал в объекте BufferedReader.Почему мой клиент правильно не читает outputStream, отправленный сервером?

Когда я использую OutputStream и PrintWriter для сервера и InputStream и Scanner для Клиента он работает хорошо.

Что происходит, что клиент в буферизации образом читает -1, если я послав INT и нуль для строки.

Надеюсь, мой английский имеет смысл. ; P

Вот код:

Сервер:

import java.io.*; 
import java.net.*; 

public class Server { 

    public static void main(String[] args) throws IOException { 

     ServerSocket server = new ServerSocket(8189); 
     Socket incoming; 

     incoming = server.accept(); 
     try { 
      // OutputStream output = incoming.getOutputStream(); 
      // PrintWriter outStream = new PrintWriter(output, true /*autoFlush*/); 
      // outStream.println("ENTER"); 
      BufferedWriter output = new BufferedWriter(new   
            OutputStreamWriter(incoming.getOutputStream())); 
      output.write(3); 
      System.out.println("\nSent"); 

     } finally { 
      incoming.close(); 
     } 
    } 
} 

Клиент:

import java.io.*; 
import java.net.*; 
import java.util.Scanner; 

public class Client { 

    public static void main(String[] args) throws UnknownHostException, IOException { 

     //Client theClient= new Client(); 
     Socket RTSPSocket; 
     int ServerPort = 8189; 
     //server name address 
     String ServerHost = "localhost"; 

     //get Server IP Address 
     InetAddress ServerIPAddress = InetAddress.getByName(ServerHost); 

     RTSPSocket = new Socket(ServerIPAddress, ServerPort); 

     try { 
      /* 
      InputStream input = theClient.RTSPSocket.getInputStream(); 
      Scanner in = new Scanner(input); 
      String line = in.nextLine(); 
      System.out.println(line); 
      */ 

      BufferedReader input = new BufferedReader(new 
            InputStreamReader(RTSPSocket.getInputStream())); 

      //String line = input.readLine(); 
      //System.out.println("\nRicevuto: " + line); 
      System.out.println(input.read()); 
     } catch (Exception e) { 
      System.err.println("Error: " + e); 
     } 
    } 
} 

ответ

1

Вам необходимо очистить данные, чтобы получить их в клиентской части.

 output.write(3); 
     output.flush(); 
     System.out.println("\nSent"); 

Если у вас есть OutputStream (или Writer), вы должны очистить свои данные, таким образом, вы на 100% уверены, что вы хотели бы отправить отправлено.

Большинство (если не все) подклассов OutputStream используют «мини-буфер», который сбрасывается только тогда, когда он заполнен или вы вручную вызываете flush(). В вашем случае это еще более вопиющее, потому что вы используете BufferedWriter.

Другое дело, когда вы используете потоки/писатели, вам действительно нужно закрыть их после того, как вы закончите, одна из главных вещей close() делает (большую часть времени) очищает последние данные, оставшиеся в «мини-буфере», ,


Ресурсы:

+0

Спасибо, ребята. Теперь это работает. Я этого не знал! – soneangel

3

попытайтесь поместить следующий код после output.write (3);

output.flush(); 

BufferedOutputStream построен только отправлять данные, если буфер заполнен (я считаю, по умолчанию 1024 байт в). Таким образом, чтобы заставить данные отправлять, вам необходимо очистить поток.

+1

Угу. Кроме того, вы захотите закрыть BufferedOutputWriter в своем блоке finally. Это также косвенно закрывает Socket, хотя обычно считается хорошей формой, чтобы явно закрыть оба. – romacafe

+0

Спасибо, ребята. Теперь это работает. Я этого не знал! – soneangel

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