2010-09-29 22 views
0

這也正是服務器使用BufferedWriter對象將發送到客戶端接收在對象BufferedReader一個簡單的客戶端 - 服務器。爲什麼我的客戶端沒有正確讀取服務器發送的outputStream?

當我使用OutputStreamPrintWriter服務器InputStreamScanner客戶它工作得很好。

會發生什麼事是,在緩衝方式的客戶端讀取-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(或作家),你必須刷新你的數據,這樣你100%肯定那是你想被髮送已發送。

大多數(如果不是全部的話)OutputStream子類使用「迷你緩衝區」,只有在它已滿或您手動調用flush()時纔會刷新。在你的情況下,它更加明目張膽,因爲你正在使用BufferedWriter。另一件事,當你使用流/作家時,你應該在完成後關閉它們,close()主要的事情之一(大部分時間)會刷新「迷你緩衝區」中剩餘的最後一個數據, 。


資源:

+0

謝謝你們。現在它可以工作。我不知道! – soneangel 2010-09-30 09:33:31

3

嘗試把下面的代碼output.write後(3);

output.flush(); 

BufferedOutputStream被構建爲只在緩衝區滿時發送數據(我相信默認1024字節)。因此,要強制發送數據,您需要刷新數據流。

+1

是啊。另外,你需要關閉你的finally塊中的BufferedOutputWriter。這樣做也會隱式關閉Socket,儘管它通常被認爲是明確關閉兩者的好形式。 – romacafe 2010-09-29 22:11:12

+0

謝謝你們。現在它可以工作。我不知道! – soneangel 2010-09-30 09:33:12