Java:从socket获取多行

时间:2012-05-06 20:47:56

标签: java sockets line

我有一个由客户端和服务器组成的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 个答案:

答案 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,然后关闭套接字。