通过socket练习手写服务器,希望在服务器接收浏览器提交请求时通过循环执行inputstream.read()获取数据放入byte[1024]中,转成字符串最后输出至控制台,但在测试时虽然浏览器提交的测试数据不到1024字节,在第一次循环时inputsrteam.read()的返回值既不是-1也不是1024,而是接受到的数据实际大小(大约400多字节),导致第二次进入while循环,程序就阻塞在第二次inputstream.read()中,此时浏览器再次提交表单时服务器这边就直接报错了,报错点仍然指向while循环判断中的inputstream.read(),这明显不合理啊,向各位大佬求解。。。
源码:
package test;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
ServerSocket server;
public static void main(String[] args) {
Server server = new Server();
server.start();
}
public void start() {
try {
server = new ServerSocket(8888);
receive();
} catch (IOException e) {
System.out.println("开启数据库失败");
e.printStackTrace();
}
}
private void receive() {
try {
Socket client = server.accept();
byte[] buff = new byte[1024];
StringBuilder sb = new StringBuilder();
BufferedInputStream bis = new BufferedInputStream(client.getInputStream());
while (-1 != bis.read(buff)) {
sb.append(new String(buff, 0, buff.length));
}
String requestInfo = sb.toString().trim();
System.out.println(requestInfo);
} catch (IOException e) {
e.printStackTrace();
System.out.println("开启客户端socket失败");
}
}
public void stop() {
}
}
浏览器第二次提交表单时,服务器这边的报错信息,(浏览器第一次提交表单时程序处于阻塞状态):
java.net.SocketException: Connection reset
开启客户端socket失败
at java.net.SocketInputStream.read(SocketInputStream.java:210)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
at java.io.FilterInputStream.read(FilterInputStream.java:107)
at test.Server.receive(Server.java:48)
at test.Server.start(Server.java:24)
at test.Server.main(Server.java:17)
bis.read(buff) 返回的不是-1,read会阻塞