服务器套接字必须等待客户端的下一个命令java
Server socket has to be wait for client's next command java
我正在制作一个简单的客户端服务器应用程序。其中客户端将向服务器发送关机,重启命令。但是如何为客户端的下一个 command.Means 套接字保留服务器套接字是一次接受命令。在该服务器不接受其他 commands.For 例如。如果客户端发送 "restart" 然后服务器将在给定时间执行命令,如果客户端发送 "abort" 命令然后它应该是 aborted.but 服务器套接字在只接受一个命令后关闭。
如何让服务器套接字等待进一步的命令?
这是服务器代码:
running = true;
try {
System.out.println("Waiting for client........");
ServerSocket serverSocket = new ServerSocket(8002);
Socket client = serverSocket.accept();
System.out.println("Connection Accepted......");
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
try {
while (running) {
String usercmnd = in.readLine();
if (usercmnd != null) {
Runtime runtime = Runtime.getRuntime();
Process p = runtime.exec(usercmnd);
//serverSocket.setSoTimeout(30000);
}
}
} catch (Exception e) {
System.out.println("Error");
e.printStackTrace();
}finally{
client.close();
System.out.println("Connection Closed......");
}
} catch (Exception e) {
System.out.println("Error");
e.printStackTrace();
}
这是客户端代码
restart.setOnClickListener(
new View.OnClickListener() {
public String rest = "shutdown -r -t 30";
@Override
public void onClick(View v) {
Socket cs = null;
try{
cs = new Socket("192.168.20.128",8002);
DataOutputStream out = new DataOutputStream(cs.getOutputStream());
out.writeBytes(rest);
Toast.makeText(PowerActivity.this, "Restart Success", Toast.LENGTH_LONG).show();
}
catch (IOException e) {
Toast.makeText(PowerActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
}finally {
try {
cs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
);
But how to hold the server socket for client's next command.Means
socket is accepting command for once. after that server is not
accepting other commands.
这取决于您向服务器发送命令的方式。
如果您在单击同一按钮时向服务器发送命令,那么我找不到从您的客户端向服务器发送的其他消息。然而,服务器正在 while 循环中等待数据。
如果您要向服务器发送命令,请单击每个按钮;那么在这种情况下,服务器只能接受一个连接,因为它只有一个 socket.accept() 方法。
如果您要以这种方式发送命令,请将您的服务器代码包装在一个 while(true) 循环中。
在那种情况下,您的服务器代码应该是这样的:
try {
System.out.println("Waiting for client........");
ServerSocket serverSocket = new ServerSocket(8002);
while(true){
Socket client = serverSocket.accept();
System.out.println("Connection Accepted......");
...//
}
在这种情况下,您必须使用线程来管理您的套接字输入流,因为 in.readLine();
是一个阻塞调用;你也有无限循环。因此,使用一个线程,将您的套接字对象(在您的服务器代码中称为 client
)传递给该线程,并将其余主体包装在线程的 运行 方法中。
注意:顺便说一句,我怀疑您正试图按照您给出的命令关闭服务器。如果是这种情况,那么它将无法进一步通信,因为服务器将关闭。
如果不是这样也就算了。可能,在那种情况下,我当时误解了你问题的命令。
我正在制作一个简单的客户端服务器应用程序。其中客户端将向服务器发送关机,重启命令。但是如何为客户端的下一个 command.Means 套接字保留服务器套接字是一次接受命令。在该服务器不接受其他 commands.For 例如。如果客户端发送 "restart" 然后服务器将在给定时间执行命令,如果客户端发送 "abort" 命令然后它应该是 aborted.but 服务器套接字在只接受一个命令后关闭。
如何让服务器套接字等待进一步的命令?
这是服务器代码:
running = true;
try {
System.out.println("Waiting for client........");
ServerSocket serverSocket = new ServerSocket(8002);
Socket client = serverSocket.accept();
System.out.println("Connection Accepted......");
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
try {
while (running) {
String usercmnd = in.readLine();
if (usercmnd != null) {
Runtime runtime = Runtime.getRuntime();
Process p = runtime.exec(usercmnd);
//serverSocket.setSoTimeout(30000);
}
}
} catch (Exception e) {
System.out.println("Error");
e.printStackTrace();
}finally{
client.close();
System.out.println("Connection Closed......");
}
} catch (Exception e) {
System.out.println("Error");
e.printStackTrace();
}
这是客户端代码
restart.setOnClickListener(
new View.OnClickListener() {
public String rest = "shutdown -r -t 30";
@Override
public void onClick(View v) {
Socket cs = null;
try{
cs = new Socket("192.168.20.128",8002);
DataOutputStream out = new DataOutputStream(cs.getOutputStream());
out.writeBytes(rest);
Toast.makeText(PowerActivity.this, "Restart Success", Toast.LENGTH_LONG).show();
}
catch (IOException e) {
Toast.makeText(PowerActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
}finally {
try {
cs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
);
But how to hold the server socket for client's next command.Means socket is accepting command for once. after that server is not accepting other commands.
这取决于您向服务器发送命令的方式。
如果您在单击同一按钮时向服务器发送命令,那么我找不到从您的客户端向服务器发送的其他消息。然而,服务器正在 while 循环中等待数据。
如果您要向服务器发送命令,请单击每个按钮;那么在这种情况下,服务器只能接受一个连接,因为它只有一个 socket.accept() 方法。
如果您要以这种方式发送命令,请将您的服务器代码包装在一个 while(true) 循环中。
在那种情况下,您的服务器代码应该是这样的:
try {
System.out.println("Waiting for client........");
ServerSocket serverSocket = new ServerSocket(8002);
while(true){
Socket client = serverSocket.accept();
System.out.println("Connection Accepted......");
...//
}
在这种情况下,您必须使用线程来管理您的套接字输入流,因为 in.readLine();
是一个阻塞调用;你也有无限循环。因此,使用一个线程,将您的套接字对象(在您的服务器代码中称为 client
)传递给该线程,并将其余主体包装在线程的 运行 方法中。
注意:顺便说一句,我怀疑您正试图按照您给出的命令关闭服务器。如果是这种情况,那么它将无法进一步通信,因为服务器将关闭。
如果不是这样也就算了。可能,在那种情况下,我当时误解了你问题的命令。