2015-02-07 139 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) { 
       ... 
      } 
     } 
    } 
} 

但请记住,此代码一次只能处理单个客户端。此代码中没有多线程。

相关问题