对于学校项目,我们需要将服务器连接到客户端并从服务器获取统计信息。我们希望将统计信息打印到客户端的命令行中。服务器运行命令,将结果发送到客户端,然后客户端在其控制台中打印结果。但是问题是客户端仅在服务器插槽关闭时才开始打印结果。
我们正在Ubuntu虚拟机上运行服务器代码,在Windows笔记本电脑上运行客户端代码。当我们在本地运行两个类时,它们会做我们想要的。但是,当我们在虚拟机上运行服务器端时,客户端将等待套接字关闭。
客户代码:
import java.io.*;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException, InterruptedException {
try{
Socket s = new Socket("localhost", 80);
s.setTcpNoDelay(true);
PrintWriter pr = new PrintWriter(s.getOutputStream());
pr.println("hello");
pr.flush();
InputStreamReader in = new InputStreamReader(s.getInputStream());
BufferedReader bf = new BufferedReader(in);
String str = bf.readLine();
System.out.println("server: " + str);
//todo dit moet in server.java gebeuren. Geen reden om elke keer hetzelfde commando door te sturen: wel extra veiligheidsrisicos
while (true){
String resultaat = bf.readLine();
System.out.println(resultaat);
Thread.sleep(1000);
}
}
catch(Exception e){
System.out.println("can't connect");
}
}
}
服务器代码:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
public class Server {
public static void main(String[] args) throws IOException, InterruptedException {
ServerSocket ss = new ServerSocket(80);
Socket s = ss.accept();
s.setTcpNoDelay(true);
System.out.println("client connected");
try {
InputStreamReader in = new InputStreamReader(s.getInputStream());
BufferedReader bf = new BufferedReader(in);
String welcome = bf.readLine();
System.out.println("Client: " + welcome);
PrintWriter pr = new PrintWriter(s.getOutputStream());
//grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage "%"}' ; uptime -p ; df /dev/sda1
String cmd = "ping www.google.com";
pr.println("Welcome client");
pr.flush();
//todo commando's in deze class zetten en om de zoveel tijd de resultaten doorsturen. Dus niet meer reageren op commando's
while (true) {
ArrayList<String> resultaat = runCommand(cmd);
for (String str : resultaat
) {
pr.println(str);
pr.flush();
}
Thread.sleep(1000);
}
}
catch (InterruptedException e){
s.close();
}
}
private static ArrayList<String> runCommand(String str) {
ArrayList<String> resultaten = new ArrayList<>();
try {
Process process = Runtime.getRuntime().exec(str);
BufferedReader ret = new BufferedReader(new InputStreamReader(process.getInputStream())); //vertaald bytes naar karakters van het eerste bericht van de client
String line; //output van bufferedreader
while ((line = ret.readLine()) != null) {
String resultaat = ret.readLine();
System.out.println(resultaat);
resultaten.add(resultaat);
System.out.println(ret.readLine());
}
System.out.println(resultaten);
} catch (IOException e) {
e.printStackTrace();
resultaten.add(e.getMessage());
}
return resultaten;
}
}
您将结果放入数组列表中的服务器中,这就是为什么它从未发送给客户端的原因,请尝试此操作
public class Server {
public static void main(String[] args) throws IOException, InterruptedException {
ServerSocket ss = new ServerSocket(8000);
Socket s = ss.accept();
s.setTcpNoDelay(true);
System.out.println("client connected");
try {
InputStreamReader in = new InputStreamReader(s.getInputStream());
BufferedReader bf = new BufferedReader(in);
String welcome = bf.readLine();
System.out.println("Client: " + welcome);
PrintWriter pr = new PrintWriter(s.getOutputStream());
// grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage
// "%"}' ; uptime -p ; df /dev/sda1
String cmd = "ping www.google.com";
pr.println("Welcome client");
pr.flush();
Process process = Runtime.getRuntime().exec(cmd);
BufferedReader ret = new BufferedReader(new InputStreamReader(process.getInputStream()));
while (ret.readLine() != null) {
pr.println(ret.readLine());
pr.flush();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
s.close();
ss.close();
}
}
}