2013-05-09 63 views
0

我一直堅持使用此客戶端服務器編程,我希望服務器維護一個存儲客戶端發送的數據的文件。代碼如下:文件管理客戶端 - 服務器編程

客戶端:

public class ClientSide { 
    public static void main(String[] argv) throws Exception { 

     String sentence; 
     BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); 
     Socket clientSocket = new Socket("localhost", 6789); 
     DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); 
     sentence = inFromUser.readLine(); 
     outToServer.writeBytes(sentence + '\n');    
     clientSocket.close(); 
} 
} 

服務器端:現在

public class ServerSide { 
    public static void main(String[] args) throws IOException { 
      File file=new File("s1.txt"); 
      ServerSocket servsock = new ServerSocket(6789); 

      Socket sock = servsock.accept(); 
      byte[] mybytearray = new byte[1024]; 
      InputStream is = sock.getInputStream(); 
      FileOutputStream fos = new FileOutputStream(file,true); 
      BufferedOutputStream bos = new BufferedOutputStream(fos); 

      int bytesRead = is.read(mybytearray, 0, mybytearray.length); 
      bos.write(mybytearray, 0, bytesRead); 

      bos.close(); 
      sock.close(); 

      BufferedReader write=new BufferedReader(new FileReader(file)); 
      String line; 
      while((line=write.readLine())!=null) { 
       System.out.println(line); 
      } 

    } 
} 

,因爲用戶將數據發送到服務器,例如 '維納亞克' 是數據發送到服務器,只有第一個字符,即'V'被寫入文件。我必須錯過代碼中的東西,我無法找到它。此外,我已經問過類似的問題here但是,無法獲得所需的結果

+0

在將readsByte寫入文件輸出流之前,嘗試在輸入流上調用flush。希望能幫助到你! – 2013-05-09 08:51:06

+0

@JunedAhsan我猜InputStream不能被刷新 – 2013-05-09 09:08:21

回答

1

您應該檢查讀操作實際上是否已經在服務器端讀取儘可能多的字節。請參閱javadocs for InputStream

實際讀取的字節數作爲整數返回。此方法阻塞,直到輸入數據可用,檢測到文件結尾或引發異常。

...

讀(B,關閉,LEN)類InputStream的方法簡單地調用read()將反覆的方法。如果第一次這樣的調用導致IOException,那麼從調用讀取(b,off,len)方法返回該異常。如果任何後續的read()調用導致IOException異常,則捕獲異常並將其視爲文件結尾;讀取到該點的字節存儲在b中,併發生異常之前讀取的字節數返回

更改您的服務器讀取的代碼是在一個循環:

int bytesRead = -1; 
    while ((bytesRead = is.read(mybytearray, 0, mybytearray.length)) != -1) { 
     System.out.println(bytesRead); 
     bos.write(mybytearray, 0, bytesRead); 
    } 

對服務器輸出方:

1 
85 
9 
9 
    ... 
5 
10 
8 
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin fermentum facilisis nulla id aliquet. Suspendisse venenatis condimentum erat adipiscing interdum. Etiam aliquet iaculis mauris lacinia lacinia. Morbi nec nisi est. Duis vel nunc a risus scelerisque feugiat. Morbi eget odio ac arcu vehicula facilisis vel ut nibh. Morbi sodales tristique ante eu aliquam. Ut a leo nisi. Morbi eu purus sed lectus mattis tincidunt. 
+0

它也說「InputStream類的read(b,off,len)方法只是簡單地調用read()方法」好吧,當我調試代碼時,它只能讀取第一個字符,即bytesRead = 1的值 – 2013-05-09 09:07:01

+0

更新了答案。 – 2013-05-09 09:26:27

+0

謝謝..這是一個愚蠢的錯誤 – 2013-05-09 09:37:18