简体   繁体   English

Java,套接字,BufferedReader和StringBuilder

[英]Java, Sockets, BufferedReader and StringBuilder

Yestarday I wrote a post about Java and Sockets, and today I'm still here because I'm having an issue with BufferedReaders. Yestarday我写了一篇关于Java和套接字的帖子,今天我还在这里,因为我遇到了BufferedReaders的问题。
I searched some questions here in StackOverflow and I understand the problem, but I can't fix it 我在StackOverflow中搜索了一些问题并且我理解了这个问题,但我无法修复它
My "application" has got two parts: a server and a client, and the scope of the application is to execute MS-DOS commands on the machine where the server is running (the commands are sent by the client). 我的“应用程序”有两部分:服务器和客户端,应用程序的范围是在运行服务器的机器上执行MS-DOS命令(命令由客户端发送)。
Now the code (I will post the total code because it's easier to understand, I will put a comment in non-working part of the code) 现在代码(我将发布总代码,因为它更容易理解,我会在代码的非工作部分发表评论)

Server: 服务器:

import java.net.*;
import java.io.*;

public class TCPCmdServer {
    public int port;
    public ServerSocket server;
    public final String version = "Beta 1.0";

    TCPCmdServer(int port) {
        this.port = port;
        if (!createServer())
            System.out.println("Cannot start the server");
        else {
            System.out.println("**********************************************");
            System.out.println("Command executer, server version: " + version);
            System.out.println("Server running on port " + port);
            System.out.println("Code by luc99a alias L99");
            System.out.println("**********************************************");
        }
    }

    public boolean createServer() {
        try {
            server = new ServerSocket(port);
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }

        return true;
    }

    public static void main(String[] args) {
        TCPCmdServer tcp = new TCPCmdServer(5000);

        while (true) {

            Socket socket = null;
            BufferedReader in = null;
            BufferedWriter out = null;

            try {
                socket = tcp.server.accept();
                System.out.println("A client has connected");
                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                out.write("Welcome on the server... type the commands you like, type END to close the connection\n");
                out.flush();
            } catch (IOException exc) {
                exc.printStackTrace();
            }

            if (socket != null && in != null && out != null) {
                try {
                    String cmd = null;
                    while (!(cmd = in.readLine()).equals("END")) {
                        System.out.println("Recieved: " + cmd);
                        Process p = Runtime.getRuntime().exec(cmd);
                        BufferedReader pRead = new BufferedReader(new InputStreamReader(p.getInputStream()));

                        String line;
                        StringBuilder builder = new StringBuilder();
                        while ((line = pRead.readLine()) != null) {
                            builder = builder.append(line + "\n");
                        }
                        out.write(builder.toString() + "\n");
                        //here is sent "EnD"
                        out.write("EnD \n");
                        out.flush();
                        System.out.println(builder.toString());
                        pRead.close();
                    }
                } catch (IOException ex) {
                    ex.printStackTrace();
                } finally {
                    System.out.println("Closing connection...");
                    try {
                        socket.close();
                        in.close();
                        out.close();
                    } catch (IOException excp) {
                        excp.printStackTrace();
                    }
                }
            }
        }

    }
}

And now the code for the client part 现在是客户端部分的代码

import java.net.*;
import java.io.*;

public class TCPCmdClient {
    public Socket socket;
    public int port;
    public String ip;
    public final String version = "Beta 1.0";

    TCPCmdClient(String ip, int port) {
        this.ip = ip;
        this.port = port;
        if (!createSocket())
            System.out.println("Cannot connect to the server. IP: " + ip + " PORT: " + port);
        else {
            System.out.println("**********************************************");
            System.out.println("Command executer, client version: " + version);
            System.out.println("Connected to " + ip + ":" + port);
            System.out.println("Code by luc99a alias L99");
            System.out.println("**********************************************");
        }
    }

    public boolean createSocket() {
        try {
            socket = new Socket(ip, port);
        } catch (IOException e) {
            return false;
        }

        return true;
    }

    public static void main(String[] args) {
        TCPCmdClient client = new TCPCmdClient("127.0.0.1", 5000);

        try {
            BufferedReader sysRead = new BufferedReader(new InputStreamReader(System.in));
            BufferedReader in = new BufferedReader(new InputStreamReader(client.socket.getInputStream()));
            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(client.socket.getOutputStream()));

            String response = in.readLine();
            System.out.println("Server: " + response);

            boolean flag = true;
            while (flag) {
                System.out.println("Type a command... type END to close the connection");
                String cmd = sysRead.readLine();
                out.write(cmd + "\n");
                out.flush();
                if (cmd.equals("END")) {
                    client.socket.close();
                    sysRead.close();
                    in.close();
                    out.close();
                    flag = false;
                } else {
                    //The loop doesn't finish because the reader
                    //listens for a new line
                    //so I used the string "EnD", sent by the server to
                    //stop the loop, anyway it doesn't seem to work
                    //I put a comment in the server where "EnD" is sent
                    String output;
                    while (((output = in.readLine()) != null)) {
                        if (output.equals("EnD")) {
                            break;
                        } else {
                            System.out.println(output);
                        }
                    }

                    System.out.println("   ***************************************   ");
                }
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}


The problem is that the BufferedReader waits for a new line forever in the while loop (I wrote a comment in the code). 问题是BufferedReader在while循环中永远等待一个新行(我在代码中写了一个注释)。 I tryed to stop it using a "special string", but it doesn't seem to work. 我尝试使用“特殊字符串”来阻止它,但它似乎不起作用。

I can't change the while in 我无法改变

String output;
while (((output = in.readLine()) != null) && output.length > 0)
{
   //code here...
}

because in the output of the MS-DOS command (think on "ipconfig") are also present empty lines. 因为在MS-DOS命令的输出中(想想“ipconfig”)也存在空行。
How could I correct it? 我怎么能纠正它?
Thank you for your help! 谢谢您的帮助!

your client Sends "EnD " (with a whitespace at the end) and you are comparing to "EnD" without a whitespace. 您的客户端发送“EnD”(末尾有空格),并且您正在与没有空格的“EnD”进行比较。 So the two strings are not equal. 所以两个字符串不相等。 try to send it without the white space: 尝试发送它没有空白区域:

out.write("EnD\n");

Space is missing. 空间不足。 In TCPCmdClient.java change 在TCPCmdClient.java中更改

if (output.equals("EnD")) {

to

if (output.equals("EnD ")) {

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM