【发布时间】:2020-09-13 07:29:12
【问题描述】:
对于学校项目,我们需要将服务器连接到客户端并从服务器获取统计信息。我们想将统计信息打印到客户端的命令行中。服务器运行命令,将结果发送给客户端,客户端在其控制台中打印结果。但问题是客户端只有在 serversocket 关闭时才开始打印结果。
我们在 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;
}
}
【问题讨论】: