3

我有一个由客户端和服务器组成的 Java 应用程序。客户端向服务器发送加密命令,服务器执行它们。

我现在遇到的问题是,使用我的加密算法,有时加密的命令包含“\n”或“\r”字符,这会弄乱我的服务器代码。这是因为我使用的是 readLine() 方法,它在找到行终止符时停止。我需要的是一种将客户端发送的所有字符读入一个字符串的方法。

这是我的代码:

public void run(){            
        System.out.println("Accepted Client!");

        try{                                
            in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream(), "ISO8859_1"));
            out = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream(), "ISO8859_1"));

            String clientCommand = null;

            while(RunThread){                    
                // read incoming stream
                do{
                    clientCommand = in.readLine();
                }while(clientCommand == null);

                //decrypt the data
                System.out.println("Client: " + clientCommand);

                if(clientCommand.equalsIgnoreCase("quit")){
                    RunThread = false;
                }else{
                    //do something
                    out.flush();
                }
            }
        }catch(Exception e){
            e.printStackTrace();
        }
  }

我尝试过的一切(使用 read() 函数的各种形式的嵌套循环)都没有奏效。我欢迎任何帮助或建议。感谢大家!

4

4 回答 4

1

我在您发布的代码中看不到加密,但通常依赖分隔符不是一个好主意。

发送二进制数据时,您应该将数据的长度预先添加到流中,然后您确切地知道期望多少字节(以及消息何时结束。)这样做也比寻找一个更有效的方式换行符。

于 2012-05-06T20:53:30.493 回答
0
// read incoming stream
do{
    clientCommand = in.readLine();
}while(clientCommand == null);

== null 似乎是错误的

尝试

String line = null;
do {
    line = in.readLine ();
    clientCommand += line
} while (line != null);
于 2012-05-06T20:56:04.073 回答
0

在使用 TCP/IP 时,您必须做的一件事是在实际消息之前发送消息长度。应用层无法预见 TCP 层正在交付给命运的包大小。因此,在您的消息之前,您必须发送一个带有消息大小的标头,而命运将只读取这些字节。关于readLine(),我认为最好使用流等其他方法。很快,一个建议:

    Socket oSocket = new Socket(sAddress, iPort);
    PrintWriter out = new PrintWriter(oSocket.getOutputStream(), true);
    BufferedReader in = new BufferedReader(new InputStreamReader(oSocket.getInputStream()));
于 2012-05-06T20:58:21.207 回答
0
do{
  clientCommand = in.readLine();
} while(clientCommand == null);

这是没有意义的。readLine()null在流结束时返回,所以你告诉 Java 在流结束时无限循环。我什至不明白为什么会有一个循环。你不想忽略来自客户端的任何输入,你想处理它。您应该从客户端读取一行,执行它,然后再读取另一行。重复直到null,然后关闭套接字。

于 2012-05-07T00:10:43.577 回答