2016-01-27 33 views
0

我正在使用套接字在Java中编写我的第一个客户端 - 服务器程序。我使用Eclipse作为IDE。当我测试两个程序(服务器和客户端)之间的通信时,首先使用命令提示符运行服务器,然后在Eclipse中运行客户端。一切正常,我可以读取和写入套接字,但是,当我关闭Eclipse中的客户端程序时,服务器程序也关闭。这是为什么发生?服务器应该在命令提示符下自行运行,它不依赖于客户端。为什么服务器在关闭客户端时停止运行?

另外我想知道是否有任何可能我可以在Eclipse中运行这两个程序,而不是先在命令提示符下打开服务器。

这里是我的两个程序代码:

服务器:

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class ServerPrg { 

public static void main(String[] args) { 

    System.out.println("Server is running....."); 

    try { 
     ServerSocket socketSer = new ServerSocket(4444); 
     Socket clientSocket = socketSer.accept(); 

     PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); 
     BufferedReader in = (new BufferedReader (new InputStreamReader(clientSocket.getInputStream()))); 

     BufferedReader stdIn = (new BufferedReader (new InputStreamReader(System.in))); 

     System.out.println("Client: " + in.readLine()); 

     String input ; 
     while((input = stdIn.readLine()) != null) 
      { out.println(input); 
       System.out.println("Client: " + in.readLine()); 
      } 
    } 

    catch (Exception e) {System.out.println("CAN'T CREATE SERVERSOCKET. PROBABLY THE PORT IS BEING USED " + e);} 

} //end main 
} //end public class 

客户:

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

public class ClientPrg { 

public static void main(String[] args) { 

    int portNumber = 4444; 

    try { 
     Socket clientSocket = new Socket("127.0.0.1", portNumber); 
     PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); 
     BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 

     BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); 

     String input; 
     while ((input = stdIn.readLine()) != null) 
     { 
      out.println(input); 
      System.out.println("Server: " + in.readLine()); 
     } 


    } catch(Exception e) 
    { 
     System.out.println(e); 
     System.out.println("CAN'T CONNECT TO THE SERVER"); 
    } 

} //end main 
} // end public class 

回答

2

您的服务器没有接受各地客户的插座回路。

这意味着,在您的客户端套接字被接受后,它将退出,因为没有流控制元素会尝试接受第二个客户端套接字。

围绕接受客户端套接字的一个简单的循环可能不是你想要的。这是因为解决方案中只有一个线程,这意味着在处理客户端时,其他客户端将无法被接受。

有很多方法可以处理上述情况。最简单的一种方法是为每个接受的客户端创建一个线程来处理客户端的通信。虽然这最初很简单,但它不能很好地扩展。对于大量的客户端来说,线程数会增加,大多数计算机可以处理比线程多得多的网络连接。

谈到规模较好的服务的范围在这里讲得很大;但是,在您熟悉每个客户端处理的一个线程后,开始查看Java NIO。

+0

我没有意识到这一点!第二个问题呢。谢谢! – c2J

+0

当然。只需创建两个运行配置文件,但下次请将您的问题限制为“每个问题一个问题”。干杯! –

相关问题