我有一个由客户端和服务器组成的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()函数的各种形式的嵌套循环)都没有用。我欢迎任何帮助或建议。谢谢大家!
答案 0 :(得分:1)
我没有在您发布的代码中看到加密,但通常依靠分隔符不是一个好主意。
发送二进制数据时,您应该将数据的长度预先添加到流中,然后确切地知道要预期的字节数(以及消息何时结束。)以这种方式执行操作的效率更高,而不是寻找换行符。
答案 1 :(得分:0)
// read incoming stream
do{
clientCommand = in.readLine();
}while(clientCommand == null);
那个== null似乎错了
尝试
String line = null;
do {
line = in.readLine ();
clientCommand += line
} while (line != null);
答案 2 :(得分: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()));
答案 3 :(得分:0)
do{
clientCommand = in.readLine();
} while(clientCommand == null);
这没有任何意义。 readLine()
仅在流的末尾返回null
,因此您告诉Java在流的末尾无限循环。我甚至不理解为什么会有一个循环。您不想忽略来自客户端的任何输入,您想要全部处理它。您应该从客户端读取一行,执行它,然后读取另一行。重复直到null
,然后关闭套接字。