2013-08-23 122 views
0

這是我從未想到的問題。我問過很多人,他們甚至都不知道。無論如何,讓我們來解決這個問題。這就是我試圖做的......創建一個客戶端和一個服務器。客戶端連接到服務器,並每3分鐘發送一條消息(我減少了測試時間)。必須有兩個獨立的線程(一個用於客戶端和服務器)。但是我發現了,客戶端將繼續發送郵件,但該服務器將在端口1234服務器套接字斷開並停止監聽

客戶不再聽:

import java.io.PrintWriter; 
import java.net.Socket; 


public class Client { 

     public Client(){ 
       startClient(); 
     } 

     public void startClient(){ 
       new Thread(new Runnable(){ 
         @Override 
         public synchronized void run(){ 
           try{ 
             Socket sendChat = new Socket("localhost", 1234); 
             PrintWriter writer = new  PrintWriter(sendChat.getOutputStream()); 

           while(true){ 
             Thread.sleep(1000); // normally 180000 

             writer.println("Hello Server!"); 
           } 
           }catch(Exception err){ 
             err.printStackTrace(); 
           } 
         } 
       }).start(); 
     } 

} 

服務器:

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.Date; 


public class Server { 

public Server(){ 
     startServer(); 
} 

    public void startServer(){ 
      new Thread(new Runnable(){ 
        @Override 
        public synchronized void run(){ 
          try{ 
            @SuppressWarnings("resource") 
            ServerSocket server = new ServerSocket(1234); 

            while(true){ 
              final Socket test = server.accept(); 
              BufferedReader reader = new BufferedReader(new InputStreamReader(test.getInputStream())); 

              while(!test.isClosed()) { 
                Date date = new Date(); 

                System.out.println("Server got message from client " + date); 
              } 
              reader.close(); 
            } 
          }catch(Exception err){ 
            err.printStackTrace(); 
          } 
        } 
      }).start(); 
    } 

} 

開始:

public class Start { 
    public static void main(String[] args){ 
     new Server(); 
     new Client(); 
    } 
} 

我將不勝感激,如果有人能告訴我什麼是錯的,因爲我老實說沒有clu即

+1

因此... *當服務器停止收聽時*有沒有錯誤信息? –

+0

@Emest跑步時沒有例外。這正是發生的情況。服務器和客戶端對象被創建。客戶端發送消息,服務器響應。客戶端發送另一條消息,服務器不響應。 – Jaccob

回答

0

請在Server類的while循環中寫下兩行以下的代碼,它對您有用。

final Socket test = server.accept(); 
BufferedReader reader = new BufferedReader(new InputStreamReader(test.getInputStream())); 

正在發生的事情在你的代碼:服務器將while循環結束後,每一次等待新的客戶端,但沒有客戶端,將要與該實例的服務器連接。因此,服務器將等待直到新的客戶端到來,服務器將接受該新客戶端並繼續處理。

+0

這很有趣。我不知道它會這樣做。謝謝! – Jaccob

+0

即時通訊在C#中有這個相同的問題,這種方法也會起作用 – shawn

0

你在一個循環中堆棧,試着在消息後關閉客戶端的連接。