繁体   English   中英

Java,套接字,BufferedReader和StringBuilder

[英]Java, Sockets, BufferedReader and StringBuilder

Yestarday我写了一篇关于Java和套接字的帖子,今天我还在这里,因为我遇到了BufferedReaders的问题。
我在StackOverflow中搜索了一些问题并且我理解了这个问题,但我无法修复它
我的“应用程序”有两部分:服务器和客户端,应用程序的范围是在运行服务器的机器上执行MS-DOS命令(命令由客户端发送)。
现在代码(我将发布总代码,因为它更容易理解,我会在代码的非工作部分发表评论)

服务器:

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

    }
}

现在是客户端部分的代码

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


问题是BufferedReader在while循环中永远等待一个新行(我在代码中写了一个注释)。 我尝试使用“特殊字符串”来阻止它,但它似乎不起作用。

我无法改变

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

因为在MS-DOS命令的输出中(想想“ipconfig”)也存在空行。
我怎么能纠正它?
谢谢您的帮助!

您的客户端发送“EnD”(末尾有空格),并且您正在与没有空格的“EnD”进行比较。 所以两个字符串不相等。 尝试发送它没有空白区域:

out.write("EnD\n");

空间不足。 在TCPCmdClient.java中更改

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

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

暂无
暂无

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

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