Bugfix

2018-10-23  本文已影响0人  小小爱笑

为了判断\r\n,按字节逐个读取。错误的使用了BufferedReader.read方法。导致\n被过滤,不会返回。

应该使用socket.getInputStream() 对象 InputStream.read方法。

BufferedReader.java

public int read() throws IOException {
       synchronized (lock) {
           ensureOpen();
           for (;;) {
               if (nextChar >= nChars) {
                   fill();
                   if (nextChar >= nChars)
                       return -1;
               }
               if (skipLF) {
                   skipLF = false;
                   if (cb[nextChar] == '\n') {
                       nextChar++;
                       continue;
                   }
               }
               return cb[nextChar++];
           }
       }
   }

使用DataInputStream.writeBytes() 写中文时乱码。

public final void writeBytes(String s) throws IOException {
        int len = s.length();
        for (int i = 0 ; i < len ; i++) {
            out.write((byte)s.charAt(i));
        }
        incCount(len);
    }

len为string的长度,对于单字节字符 string长度等于 字符串对应的字节数组长度。 中文是多子节字符,一个字符通常对应2个字节。
可以使用String.getBytes(StandardCharsets.UTF_8) 编码后,使用 DataInputStream.write()进行写入。


InputStream is = ...; 
OutputStream os = ...; 
byte[] buffer = new byte[1024 * 8];
int len;
while((len = is.read(buffer)) > 0) {
  os.write(buffer, 0, len);
}
os.flush();

网络io时, is.read()可能返回0, 表示等待缓冲区输入,并没有结束。
所以,判断输入流结束不能根据>0判断。

while((len = is.read(buffer)) >= 0) {
  ...
}

var name = document.getElementById('myName');
console.log(name.value);

var name, 与window.name 重名,被覆盖, 导致无法获取值。

var myName = document.getElementById('myName');
console.log(myName.value);
上一篇下一篇

猜你喜欢

热点阅读