socket与服务器端通信

monwx1rj  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(385)

我需要从服务器上读取一些数据,我可以通过终端获取它们,现在我需要自动化。基本上我需要发送命令(红色)和读取响应(黄色)。

据我所知,我可以解决使用套接字的任务。我实现了一个使用socket的类(见下文)
连接很好。

Socket clientSocket = new Socket(endpoint, port);
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

然后我发出这样的命令:

out.println(msg);  // msg = "Gstatus\r\n"

之后,我希望bufferreader有一些数据要读取

int letter;
while(in.ready() && (letter = in.read()) != -1) {
    char c = (char) letter;
    res += c;
}

但是res总是空的。
你能告诉我我做错了什么吗?或者纠正我的方向。
谢谢。

64jmpszr

64jmpszr1#

我是用 DataInputStream 以及 DataOutputStream 这样地:
服务器.java:

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(10001);
        Socket socket = serverSocket.accept();
        DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
        DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
        String command = (String) dataInputStream.readUTF();
        StringBuilder commandLineResult = new StringBuilder();
        Process process = Runtime.getRuntime().exec(command);
        try (BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
            String line;
            while ((line = br.readLine()) != null) {
                commandLineResult.append(line + "\n");
            }
        }
        dataOutputStream.writeUTF(commandLineResult.toString());
        serverSocket.close();
    }
}

客户端.java:

public class Client {
    public static void main(String[] args) throws UnknownHostException, IOException {
        Socket clientSocket = new Socket("localhost", 10001);
        DataOutputStream dataOutputStream = new DataOutputStream(clientSocket.getOutputStream());
        DataInputStream dataInputStream = new DataInputStream(clientSocket.getInputStream());
        dataOutputStream.writeUTF("ls -l");
        System.out.println(dataInputStream.readUTF());

    }
}

当服务器运行时,客户机可以使用其 DataOutputStream . 之后,服务器可以使用该命令:
服务器使用 DataInputStream 然后它把它传递到 Runtime.getRuntime().exec(command) 方法。这种方法有其独特的优点 inputStream 你以后可以从中阅读 process 并写入服务器的 DataOutputStream ,它将命令行内容发送到客户端套接字。之后,您可以使用客户端的 DataInputStream .

相关问题