InputStream无法与BufferReader同时用

​ 前两天客户端这边有一块业务一开始想的是用socket直接跟后端传数据,后来后端觉得基于目前的框架改太麻烦于是协商了一下还是改为HTTP协议,我一想HTTP传过来过我把HTTP的头给忽略掉不就可以了于是直接动手撸了个HTTP服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Socket socket = serverSocket.accept();

BufferedReader r = new BufferedReader(new InputStreamReader(socket.getInputStream()));
LinkedHashMap<String, String> headerFields = new LinkedHashMap<String, String>();
for(String header; (header = r.readLine()) != null && !header.isEmpty();){
//解析HTTP头
...
}

System.out.println(header)

int length = Integer.parseInt(headerFields.get("Content-Length"));
byte[] buffer = new byte[length];
socket.getInputStream().read(buffer);
//处理业务数据
...

OutputStream out = socket.getOutputStream();
out.write("HTTP/1.1 200 OK\r\n".getBytes());
out.write("\r\n".getBytes());
out.write("fuck you\r\n").getBytes());
out.flush();
socket.close();

3分钟撸好信心满满的点了Run按钮,前面HTTP头正确读取出来但是到了socket.getInputStream().read(buffer); 这行就会卡主很奇怪看来看去一脸懵逼反复检查发送的数据和数据长度都没问题,过了很久才怀疑到BufferedReader头上于是跟了一下代码发现这厮会读取超过一行的长度导致之后用原始的InputStream读的时候会超过发送的数据长度导致卡住(其实是在等待客户端发送),后来解析头直接选择一个字节一个字节的读这样就没有问题了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//read header
LinkedHashMap<String, String> headerFields = new LinkedHashMap<String, String>();
InputStream in = socket.getInputStream();
for(int b; (b = in.read()) != -1; )
{
baos.write(b);
if(b == '\n')
{
//解析HTTP头
...
}
}

//read body
if(!headerFields.containsKey("Content-Length"))
{
throw new Exception("request header not specify body length!");
}
byte[] buffer = new byte[Integer.parseInt(headerFields.get("Content-Length"))];
int len = in.read(buffer);
//处理业务数据
...

OutputStream out = socket.getOutputStream();
out.write("HTTP/1.1 200 OK\r\n".getBytes());
out.write("\r\n".getBytes());
out.write("fuck you\r\n").getBytes());
out.flush();
socket.close();
Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2015-2024 Kaisar
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信