Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用InputStreamReader从套接字接收utf-8字符串?_Java_Sockets_Inputstream_Inputstreamreader - Fatal编程技术网

Java 使用InputStreamReader从套接字接收utf-8字符串?

Java 使用InputStreamReader从套接字接收utf-8字符串?,java,sockets,inputstream,inputstreamreader,Java,Sockets,Inputstream,Inputstreamreader,我正在尝试使用以下代码从设备接收字符串: byte[]buf=新字节[4]; int read=INFOROMDEVICE.read(buf); Logger.getLogger(Utill.class.getName()+“DEBUG_ERR01”).log(Level.INFO,“字节读取:{0}”,读取); int-msgLength=ByteBuffer.wrap(buf.getInt(); Logger.getLogger(Utill.class.getName()+“DEBUG_ER

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

byte[]buf=新字节[4];
int read=INFOROMDEVICE.read(buf);
Logger.getLogger(Utill.class.getName()+“DEBUG_ERR01”).log(Level.INFO,“字节读取:{0}”,读取);
int-msgLength=ByteBuffer.wrap(buf.getInt();
Logger.getLogger(Utill.class.getName()+“DEBUG_ERR01”).log(Level.INFO,“消息长度:{0}”,msgLength);
读卡器r=新的InputStreamReader(INFOROMDevice);
char[]cb=新字符[msgLength];
int-actualCharsRead=r.read(cb);
Logger.getLogger(Utill.class.getName()+“DEBUG_ERR01”).log(Level.INFO,“实际字符读取:{0}字符数组长度:{1}”,新对象[]{actualCharsRead,cb.length});
String msgText=String.valueOf(cb,0,cb.length);
Logger.getLogger(Utill.class.getName()+“记录接收的消息:”).log(Level.INFO,msgText);
返回msgText;
从接受的ServerSocket获取INFOROMDevice和InputStream

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

日志中的一个示例是
实际字符读取:1020字符数组长度:1391


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

一个
InputStreamReader
只会阻塞,直到它可以将一个字符读入缓冲区或检测到EOF为止。不能保证缓冲区会被填满


如果您的协议指示要发送的字符串的长度,接收器需要循环,跟踪剩余的字符数,直到所有字符都被读取。

如果您特别想要UTF-8,为什么不告诉我呢?我打赌
msgLength
以字节为单位,那么为什么您希望字符数与字节数相同,如果消息包含非ASCII字符且编码为UTF-8。您知道UTF-8是如何工作的,对吗?@Andreas no协议指定前4个字节是发送的UTF-8字符数。我没有告诉InputStreamReader关于UTF-8的事情,因为它是默认的。这似乎是合乎逻辑的,我会尝试一下,你建议一种干净的循环方式,还是我应该使用其他类型的读取器@erickson@alibttb您可以执行类似于
CharBuffer expected=CharBuffer.wrap(cb)的操作;while(cb.haslaining())r.read(应为)
在读取保存消息长度的
ByteBuffer
数据时,您应该执行类似操作。您的意思是
CharBuffer expected=CharBuffer.wrap(cb);while(应为.haslaining()){r.read(应为);}
@erickson@alibttb是的,很抱歉打错了。你说得对。