Java套接字自动重启服务器
我使用Oracle的例子来编程服务器和客户机,当客户机连接到服务器时,它会收到一个敲门笑话来与之交互。一切都很顺利 但我的问题是,当客户端完成并从服务器断开连接时,服务器程序也会终止。如果服务器终止,我如何让它再次自动运行,以便它可以接受另一个客户端的请求,而不必手动重新启动服务器端 下面是我的代码,注释显示了我被卡住的地方。我使用的是在vmware player上运行的两个centos虚拟机Java套接字自动重启服务器,java,serversocket,Java,Serversocket,我使用Oracle的例子来编程服务器和客户机,当客户机连接到服务器时,它会收到一个敲门笑话来与之交互。一切都很顺利 但我的问题是,当客户端完成并从服务器断开连接时,服务器程序也会终止。如果服务器终止,我如何让它再次自动运行,以便它可以接受另一个客户端的请求,而不必手动重新启动服务器端 下面是我的代码,注释显示了我被卡住的地方。我使用的是在vmware player上运行的两个centos虚拟机 import java.net.*; import java.io.*; public class
import java.net.*;
import java.io.*;
public class KnockKnockServer {
public static void main(String[] args) throws IOException {
server();
/*HERE IS WHERE I AM STUCK
* If I call server() above in my main method everything runs great.
* However, I would like to put a timer or something inside main so that
* every second it checks to see if server() is still running and if not
* then start it up again.
*/
}
public static void server() throws IOException{
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(4444);
} catch (IOException e) {
System.err.println("Could not listen on port: 4444.");
System.exit(1);
}
Socket clientSocket = null;
try {
clientSocket = serverSocket.accept();
} catch (IOException e) {
System.err.println("Accept failed.");
System.exit(1);
}
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocket.getInputStream()));
String inputLine, outputLine;
KnockKnockProtocol kkp = new KnockKnockProtocol();
outputLine = kkp.processInput(null);
out.println(outputLine);
while ((inputLine = in.readLine()) != null) {
outputLine = kkp.processInput(inputLine);
out.println(outputLine);
if (outputLine.equals("Bye."))
break;
}
out.close();
in.close();
clientSocket.close();
serverSocket.close();
}
}
处理完一个连接后,请关闭
serverSocket
:
serverSocket.close();
public class ClientWorker implements Runnable {
public ClientWorker(Socket clientSocket) {
this.clientSocket = clientSocket;
}
public void launch() {
new Thread(this).start();
}
@Override
public void run() {
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
...
您需要保持此状态,并将接收到的客户端连接转移到工作线程
在main
方法中,您将有:
while (serverIsActive) {
clientSocket = serverSocket.accept();
new ClientWorker(clientSocket).launch();
}
ClientWorker
将是Runnable
并处理客户端连接:
serverSocket.close();
public class ClientWorker implements Runnable {
public ClientWorker(Socket clientSocket) {
this.clientSocket = clientSocket;
}
public void launch() {
new Thread(this).start();
}
@Override
public void run() {
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
...
处理完一个连接后,请关闭
serverSocket
:
serverSocket.close();
public class ClientWorker implements Runnable {
public ClientWorker(Socket clientSocket) {
this.clientSocket = clientSocket;
}
public void launch() {
new Thread(this).start();
}
@Override
public void run() {
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
...
您需要保持此状态,并将接收到的客户端连接转移到工作线程
在main
方法中,您将有:
while (serverIsActive) {
clientSocket = serverSocket.accept();
new ClientWorker(clientSocket).launch();
}
ClientWorker
将是Runnable
并处理客户端连接:
serverSocket.close();
public class ClientWorker implements Runnable {
public ClientWorker(Socket clientSocket) {
this.clientSocket = clientSocket;
}
public void launch() {
new Thread(this).start();
}
@Override
public void run() {
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
...
您可以将连接处理代码移动到一个额外的线程(我们称之为KnockHandler): 一旦有人连接到您的服务器,您将创建KnockHandler的新实例并启动它:
try {
clientSocket = serverSocket.accept();
KnockKnockHandler handler = new KnockKnockHandler(clientSocket);
handler.start();
} catch (IOException e) {
System.err.println("Accept failed.");
System.exit(1);
}
如果将其放入循环中,服务器将永远不会关闭(抛出异常或JVM终止除外;-):
如果客户端连接,您的服务器将启动一个新线程并进入循环的下一个迭代,等待下一个客户端连接。您可以将连接处理代码移动到一个额外的线程(我们称之为knockHandler): 一旦有人连接到您的服务器,您将创建KnockHandler的新实例并启动它:
try {
clientSocket = serverSocket.accept();
KnockKnockHandler handler = new KnockKnockHandler(clientSocket);
handler.start();
} catch (IOException e) {
System.err.println("Accept failed.");
System.exit(1);
}
如果将其放入循环中,服务器将永远不会关闭(抛出异常或JVM终止除外;-):
如果客户端连接,您的服务器将启动一个新线程并进入循环的下一个迭代,并等待下一个客户端连接。在最后一段代码中,我在KnockKnockHandler=KnockKnockHandler(clientSocket)上遇到一个错误。我将其替换为knockHandler=newknockHandler();handler.knockworker(clientSocket);在最后一段代码中,我在KnockKnockHandler=KnockKnockHandler(clientSocket)上得到一个错误。我将其替换为knockHandler=newknockHandler();handler.knockworker(clientSocket);