TCP服务器客户端,客户端仅在服务器套接字关闭时打印输入的字符串

问题描述 投票:0回答:1

对于学校项目,我们需要将服务器连接到客户端并从服务器获取统计信息。我们希望将统计信息打印到客户端的命令行中。服务器运行命令,将结果发送到客户端,然后客户端在其控制台中打印结果。但是问题是客户端仅在服务器插槽关闭时才开始打印结果。

我们正在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;
    }
}
java tcp client
1个回答
0
投票

您将结果放入数组列表中的服务器中,这就是为什么它从未发送给客户端的原因,请尝试此操作

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();
        }
    }
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.