2016-11-11 24 views
0

我創建了一個java類TCPClient,它將Message對象發送給TCPServer。我使用DataOutputStream和DataInputstream(這是我們被告知這樣做的任務,我們必須使用它們才能將客戶端發送到服務器)。 這是我的TcpClient類讓服務器繼續使用DataInputStream監聽輸入流

public class TCPClient { 
public static final int PORT = 4000; 
public static void main(String[] args){ 
    String hostname = "localhost"; 
    try(Socket client = new Socket(hostname,PORT); 
     //BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
     BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in))) { 

     Message message; 
     String input; 
     String the_message; 
     double random; 
     int id; 
     while(!(input = stdIn.readLine()).equalsIgnoreCase("end")){ 
      random = Math.random()*100; 
      message = new Message(); 
      the_message = input; 
      id = (int)random; 
      message.setId(id); 
      message.setMessage(the_message); 
      encode(message,client); 
      //System.out.println(in.readLine()); 
     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
private static void encode(Message message, Socket client) { 
    try(DataOutputStream out = new DataOutputStream(client.getOutputStream())){ 
     out.writeUTF(message.getMessage()); 
     out.writeInt(message.getId()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
}} 

TCPSERVER類

public class TCPServer { 
public static final int PORT = 4000; 

public static void main(String[] args) { 
    try (ServerSocket ss = new ServerSocket(PORT); 
     Socket cs = ss.accept(); 
     //PrintWriter out = new PrintWriter(cs.getOutputStream(), true); 
    ) { 
     Message message = decode(cs); 
     System.out.print("Message received: " + message.getMessage() + " id: " + message.getId()); 



    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 
private static Message decode(Socket client){ 
    Message message = new Message(); 
    try(DataInputStream in = new DataInputStream(client.getInputStream())){ 
     message.setMessage(in.readUTF()); 
     message.setId(in.readInt()); 
     return message; 
    } catch (IOException e) { 
     System.err.print("Error happened while decoding object"); 
     return null; 
    } 
}} 

我不什麼想要做的是,當我從客戶端發送新郵件服務器關閉。我希望服務器繼續收聽消息。我如何實現這一目標?

嘗試過這樣的事情

while(cs.getInputStream().available()==0){ 
      Message message = decode(cs); 
      System.out.println("Message received = " + message.getMessage() + " id " + message.getId()); 
     } 

但沒有工作

編輯:我不希望建立一個多線程服務器託管多個客戶。我希望單個服務器從一個唯一的客戶端接收幾條消息,並在客戶端發送「end」時關閉套接字,我不知道這是否可能。

+0

你想讓客戶端發送一個或多個消息,服務器來傾聽他們,是嗎? – nandsito

+0

是的,那是我想要的 –

回答

0

您的客戶端最多隻發送一條消息,因爲encode()通過關閉套接字輸出流來關閉套接字。如果你想在客戶端發送多封郵件,嘗試這樣的事情:

public class TCPClient { 
    // ... 
    public static void main(String[] args) { 
     try (Socket client = new Socket(hostname, PORT); 
      BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); 
      DataOutputStream out = new DataOutputStream(client.getOutputStream())) { 
      // ... 
      while (!(input = stdIn.readLine()).equalsIgnoreCase("end")) { 
       // ... 
       encode(message, out); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private static void encode(Message message, DataOutputStream out) throws IOException { 
     out.writeUTF(message.getMessage()); 
     out.writeInt(message.getId()); 
    } 
} 

服務器還收到了一個消息,因爲decode()通過關閉其輸入流關閉套接字。這應該做到這一點:

public class TCPServer { 
    // ... 
    public static void main(String[] args) { 
     try (ServerSocket ss = new ServerSocket(PORT)) { 
      // Accepts infinite clients. 
      while (true) { 
       try (Socket cs = ss.accept(); 
        DataInputStream in = new DataInputStream(client.getInputStream())) { 
        boolean isClientOpen = true; 
        while (isClientOpen) { 
         try { 
          Message message = decode(in); 
          System.out.print("Message received: " + message.getMessage() + " id: " + message.getId()); 
         } catch (IOException e) { 
          // The client may have closed the socket. 
          isClientOpen = false; 
         } 
        } 
       } 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private static Message decode(DataInputStream in) throws IOException { 
     Message message = new Message(); 
     message.setMessage(in.readUTF()); 
     message.setId(in.readInt()); 
     return message; 
    } 
}