2014-02-26 62 views
0

基本上我有一個客戶端,它將單詞列表發送到服務器。服務器刪除重複的單詞。我將「remmoved duplicate」這個單詞存儲在一個新的集合中,但是我無法將這個數據結構中的新單詞發回給客戶端。程序似乎卡在這個循環中,while((clientSentence = inFromClient.readLine())!= null)',然後我不能再把新的一組單詞寫回客戶端。任何人都可以幫我解決這個問題嗎?Java Sever發送單詞列表回到客戶端

誰能幫我這個請

這裏是服務器代碼:

import java.io.*; 

import java.net.*; 
import java.util.LinkedHashSet; 
import java.util.Set; 

class Server { 

    private static boolean isFinished; 

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

    { 

     String clientSentence; 

     String capitalizedSentence; 

     ServerSocket welcomeSocket = new ServerSocket(6789); 

     Set<String> lines = new LinkedHashSet<String>(10000); 

     while (true) { 

     Socket connectionSocket = welcomeSocket.accept(); 

     BufferedReader inFromClient = new BufferedReader(new InputStreamReader(
       connectionSocket.getInputStream())); 
     DataOutputStream outToClient = new DataOutputStream(
       connectionSocket.getOutputStream()); 

     while ((clientSentence = inFromClient.readLine()) != null) { 

      capitalizedSentence = clientSentence.toUpperCase(); 

      lines.add(capitalizedSentence); 


     } 

     for (String string : lines) { 
      outToClient.writeBytes(string); 

     } 

     } 
    } 
} 

客戶

import java.io.*; 

import java.net.*; 
import java.util.LinkedHashSet; 
import java.util.Set; 

public class Client { 

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

    { 
     String sentence; 
     String modifiedSentence; 
     File myfile = new File("C:/Users/Tudor/Desktop/test.txt"); 

     BufferedReader inFromUser = new BufferedReader(new FileReader(myfile)); 
     Socket clientSocket = new Socket("localhost", 6789); 
     DataOutputStream outToServer = new DataOutputStream(
       clientSocket.getOutputStream()); 

     BufferedReader inFromServer = new BufferedReader(new InputStreamReader(
       clientSocket.getInputStream())); 
     Set<String> lines = new LinkedHashSet<String>(10000); 

     while ((sentence = inFromUser.readLine()) != null) { 
      outToServer.writeBytes(sentence + "\n"); 

      modifiedSentence = inFromServer.readLine(); 

      lines.add(modifiedSentence); 
      System.out.println("FROM SERVER: " + modifiedSentence); 
     } 

     // for (String string : lines) { 
     // System.out.println(string); 
     // } 
     clientSocket.close(); 
    } 
} 

回答

0

在客戶端,你與BufferedReader#readLine讀一些期待\n來。

但是從服務器,你發送stringwriteBytes(string))沒有\n所以如何readLine將讀取該字符串。

附加\nstring你發送給客戶端。

的主要問題是在這裏:

在客戶端你期待發送每一行服務器

while ((sentence = inFromUser.readLine()) != null) { 
      outToServer.writeBytes(sentence + "\n"); 

      modifiedSentence = inFromServer.readLine();// here you are expecting the answer from server but server is busy in listening more data 

      lines.add(modifiedSentence); 
      System.out.println("FROM SERVER: " + modifiedSentence); 
     } 

你的服務器後,從服務器獲取數據依舊忙忙碌碌地監聽數據。

while ((clientSentence = inFromClient.readLine()) != null) { 

      capitalizedSentence = clientSentence.toUpperCase(); 

      lines.add(capitalizedSentence); 


     } 

不要在服務器端代碼的一些變化這樣

while ((clientSentence = inFromClient.readLine()) != null) { 

      capitalizedSentence = clientSentence.toUpperCase(); 

      outToClient.writeBytes(capitalizedSentence+"\n"); 
      // imideately send data after converting it as client is expecting the data to receive and must append '\n' 


     } 

還有一個解決辦法是::

更改的客戶端代碼如下所示:

while ((sentence = inFromUser.readLine()) != null) { 
      outToServer.writeBytes(sentence + "\n"); 

// modifiedSentence = inFromServer.readLine(); Remove this line from here 

//   lines.add(modifiedSentence); 
//   System.out.println("FROM SERVER: " + modifiedSentence); 
     } 

製作用於從服務器讀取數據的while循環

while ((modifiedSentence = inFromServer.readLine()) != null) { 

     // make 'clientlines' as a set at client side and store all lines coming from server  
       clientlines.add(capitalizedSentence); 


      } 

小費:如果您使用DataOutputStream寫,然後使用DataInputStream閱讀。

+0

這並不能解決問題,因爲循環仍然掛起。我試過用'\ n'和'\ r'和'\ r \ n' – user2219097

+0

@ user2219097查看編輯 –

+0

是的,我測試過了,它工作但在服務器端我有一組所有行,並且在執行完循環後,我想將集合中的所有內容發送到客戶端,但它只能在while循環內運行,而不能在 – user2219097

相關問題