从套接字使用输入流读取器接收 utf-8 字符串?

我正在尝试使用此代码从设备接收字符串:


        byte[] buf = new byte[4];

        int read = inFromDevice.read(buf);

        Logger.getLogger(Utill.class.getName() + " DEBUG_ERR01").log(Level.INFO, "Bytes read: {0}", read);

        int msgLength = ByteBuffer.wrap(buf).getInt();

        Logger.getLogger(Utill.class.getName() + " DEBUG_ERR01").log(Level.INFO, "Message length: {0}", msgLength);

        Reader r = new InputStreamReader(inFromDevice);

        char[] cb = new char[msgLength];

        int actualCharsRead = r.read(cb);

        Logger.getLogger(Utill.class.getName() + " DEBUG_ERR01").log(Level.INFO, "Actual chars read: {0} char array length: {1}", new Object[]{actualCharsRead, cb.length});

        String msgText = String.valueOf(cb, 0, cb.length);

        Logger.getLogger(Utill.class.getName() + "Messages Loggining recieve: ").log(Level.INFO, msgText);

        return msgText;

从设备中和输入流从接受的服务器插槽中获取。


代码大部分时间都在工作并返回消息,但有时我收到的消息小于msgLength(根据协议是错误的)


日志中的一个示例是Actual chars read: 1020 char array length: 1391


我认为由于网络问题或设备出现问题,问题是外部的,但我需要一些专家见解。Java中是否有任何已知问题可能导致这种情况?


鸿蒙传说
浏览 137回答 1
1回答

呼啦一阵风

将仅阻塞,直到它可以将一个字符读入缓冲区或检测到 EOF。不能保证缓冲区将被填满。InputStreamReader如果您的协议指示要发送的字符串的长度,则接收方需要循环,跟踪剩余的字符数,直到全部被读取。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java