Bugfix
2018-10-23 本文已影响0人
小小爱笑
-
socket读不到 '\n', 导致无法区分用\r\n作为分割的请求头。
为了判断\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) {
...
}
-
<input id='myName'/> 无法获取value
var name = document.getElementById('myName');
console.log(name.value);
var name, 与window.name 重名,被覆盖, 导致无法获取值。
var myName = document.getElementById('myName');
console.log(myName.value);