【问题标题】:TCP server client, client only prints incoming string when server socket is closedTCP 服务器客户端,客户端仅在服务器套接字关闭时打印传入字符串
【发布时间】: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;
    }
}

【问题讨论】:

    标签: java tcp client


    【解决方案1】:

    你把你的结果放在一个数组列表中的服务器上,这就是为什么它永远不会发送到客户端,试试这个

    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();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      • 2011-11-15
      • 1970-01-01
      • 2013-01-18
      • 2013-01-16
      • 1970-01-01
      相关资源
      最近更新 更多