我正在使用套接字在Java中编写我的第一个Client-Server程序。我使用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
答案 0 :(得分:2)
您的服务器缺少接受客户端套接字的循环。
这意味着在接受客户端套接字之后,它将退出,因为没有流控制元素会尝试接受第二个客户端套接字。
接受客户端套接字的简单循环可能不是您想要的。这是因为解决方案中只有一个线程,这意味着在处理客户端时,其他客户端将无法被接受。
有很多方法可以处理上述情况。最简单的方法之一是为每个接受的客户端创建一个线程来处理客户端的通信。虽然这最初很简单,但它不能很好地扩展。对于大量客户端,线程数将会增加,并且大多数计算机可以处理比线程更多的网络连接。
谈论可扩展的服务的范围在这里很难解决;但是,在熟悉每个客户端处理的一个线程之后,请开始查看Java NIO。