【问题标题】:BufferedReader , readLine operates at halfBufferedReader , readLine 操作一半
【发布时间】:2013-12-16 17:56:33
【问题描述】:

您好,我尝试使用我的 java 应用程序(当客户端与服务器已建立),但它的工作似乎只完成了一半。我只收到 2 到 3 行,有人可以帮助我吗?

class test implements Runnable {
    @Override
    public void run() {

        try {

                while(true){
                    DataInputStream reader = new DataInputStream(socket.getInputStream());
                    BufferedReader inFromClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            int tailleMessage = reader.readUnsignedShort();
            if (reader.available() < tailleMessage ){
                return;
            }
               while (( messagep = inFromClient.readLine()) != null){
                   tailleMessage = reader.readUnsignedShort();
               final String azrty = messagep;                    

            if(!azrty.isEmpty()){
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    Chat.TextChat.append("\n"+azrty);
                }

            });
            }

               }
            }

        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        catch (Exception e) {
            e.printStackTrace();
            Log.d("erreur",e.toString());
        }
    }

}

【问题讨论】:

    标签: java android tcp client-server


    【解决方案1】:

    您不能在 Socket 上同时使用 BufferedReader 和另一个输入流。缓冲区将从输入流中“窃取”数据。您需要相应地重新设计您的协议。可能您应该使用 writeUTF()/readUTF() 来发送字符串,而不是作为行发送。或者是西比尔,你应该使用 ObjectInput/OutputStreams。

    【讨论】:

    • DataInputStream 只是为了查看是否有可用的数据,我不能使用 writeUTF() 因为我使用的是带有 Qt 的 C++ 客户端,而 c++ 没有这个方法。
    • 您也将它用于 readUnsignedShort()。你不需要可用的()。 readLine() 将在没有数据时阻塞。您的协议实际上没有意义,因为您已经对其进行了编码。看来您应该先读取一个整数,然后再读取那么多行。尽管已弃用,但您可能必须使用 DataInputStream.readLine()。
    • 好的,但这对我来说似乎很奇怪,因为客户端读取了前三行然后我需要发送另一行,此时我将收到另外三行
    • 讨论你目前的实现是如何工作的毫无意义,因为它没有。
    • 您的方法非常有效:) 谢谢。你推荐我什么?像您之前推荐我一样使用 DataInputStream 或使用 BufferedReader 但更改发送线路方法并且只发送线路而不是数字 + 线路,为我服务的号码知道线路的长度
    猜你喜欢
    • 2013-03-09
    • 2016-01-08
    • 2015-06-07
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 2015-09-29
    • 2018-09-26
    相关资源
    最近更新 更多