2015-02-07 194 views
1

我有一個非常簡單的大寫Java程序。客戶端將從標準輸入讀取的文本發送到將該文本轉換爲大寫字母的服務器。程序運行良好,但一旦客戶端停止(使用NetBeans IDE),服務器也會重置。無論客戶端是否停止,服務器套接字都應該監聽來自客戶端的新連接。java:關閉客戶端套接字重置服務器套接字

public class Client 
{ 
public static void main(String[] args) throws IOException 
{ 
    try(Socket s=new Socket("localhost",9090)) 
    { 
     while(true) 
     { 
      PrintWriter out=new PrintWriter(s.getOutputStream(),true); 
      BufferedReader rd=new BufferedReader(new InputStreamReader(s.getInputStream())); 
      BufferedReader from=new BufferedReader(new InputStreamReader(System.in)); 

      String read=from.readLine(); 

      out.println(read); 

      String answer; 
      answer=rd.readLine(); 

      System.out.println(answer); 
     } 
    } 
} 
} 

public class Server 
{ 
public static void main(String[] args) throws IOException 
{ 
    try(ServerSocket listener = new ServerSocket(9090); 
      Socket socket = listener.accept();) 
      { 

       while (true) 
       { 
        BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream())); 
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 

        System.out.println("Started..."); 

        String transform=br.readLine(); 

        String newStr=transform.toUpperCase(); 

        out.println(newStr); 
       } 
      } 
} 
} 
+1

那麼,你的程序只接受一個連接。如果你想接受更多,你應該有一個循環。請參閱[Java Socket服務器教程,最後一部分](http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html#later) – RealSkeptic 2015-02-07 20:56:20

+0

「使用循環」也是我的答案。 – markspace 2015-02-07 20:56:44

回答

-1

您的Server正在關閉連接,然後完成,因爲它是在while循環之外創建的。我相信這是你需要的。

public class Server { 
    public static void main (final String[] args) 
      throws IOException { 

     while (true) { 

      try (ServerSocket listener = new ServerSocket(9090); Socket socket = listener.accept();) { 

       while (true) { 
        final BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
        final PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 

        System.out.println("Started..."); 

        final String transform = br.readLine(); 
        if (transform == null) 
         break; 

        final String newStr = transform.toUpperCase(); 

        out.println(newStr); 
       } 
      } 
     } 
    } 
} 
+0

不,因爲這個程序只會從每個客戶端讀取一行。 – RealSkeptic 2015-02-07 21:00:48

+0

對不起,我沒注意。更新了答案。 – h7r 2015-02-07 21:03:32

+0

不,因爲這個程序在循環內部創建了'ServerSocket',並且泄漏了套接字。 – EJP 2015-02-07 22:54:48

0

會發生什麼是正常行爲。您的服務器代碼只包括處理單個客戶端。 listener.accept()函數只接受最新的連接到服務器。您需要將listened.accept()放入循環中,並處理所有引發的異常。服務器端代碼應如下所示:

public class Server 
{ 
    public static void main(String[] args) throws IOException 
    { 
     try(ServerSocket listener = new ServerSocket(9090); 
     while (true) { 
      try { 
         Socket socket = listener.accept();) 
         … 
      } catch (SocketException ex) { 
       ... 
      } 
     } 
    } 
} 

但請記住,此代碼一次只能處理單個客戶端。此代碼中沒有多線程。

相關問題