为什么当我关闭客户端时服务器停止 运行?
Why the server stops running when I close the Client?
我正在 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
您的服务器缺少接受客户端套接字的循环。
这意味着在您的客户端套接字被接受后,它将退出,因为没有流控制元素会尝试接受第二个客户端套接字。
接受客户端套接字的简单循环可能不是您想要的。那是因为解决方案中只有一个线程,这意味着当处理一个客户端时,其他客户端将无法被接受。
有很多方法可以处理上述情况。最简单的方法之一是为每个接受的客户端创建一个线程来处理客户端的通信。虽然这最初很简单,但扩展性不是很好。随着大量客户端,线程数会增加,大多数计算机可以处理比线程多得多的网络连接。
讨论可扩展的服务的范围太大了,无法在这里解决;但是,在您熟悉每个客户端处理一个线程之后,开始查看 Java NIO。
我正在 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
您的服务器缺少接受客户端套接字的循环。
这意味着在您的客户端套接字被接受后,它将退出,因为没有流控制元素会尝试接受第二个客户端套接字。
接受客户端套接字的简单循环可能不是您想要的。那是因为解决方案中只有一个线程,这意味着当处理一个客户端时,其他客户端将无法被接受。
有很多方法可以处理上述情况。最简单的方法之一是为每个接受的客户端创建一个线程来处理客户端的通信。虽然这最初很简单,但扩展性不是很好。随着大量客户端,线程数会增加,大多数计算机可以处理比线程多得多的网络连接。
讨论可扩展的服务的范围太大了,无法在这里解决;但是,在您熟悉每个客户端处理一个线程之后,开始查看 Java NIO。