各位大神好,本人非专业程序员,业余时间自学java遇到如下问题:
在学习编写服务器的过程中,尝试使用字节数组对POST方式的HTTP请求进行读取。
尝试了两个方法:
1. 直接使用.available()方法获得请求输入流的长度,并定义对应大小的字节数组,程序能够正常运行并输出请求
2. 将字节数组大小固定为10,使用while循环读取,此时程序是没有输出的。
于是在while循环中增加了输出每个循环读取内容到控制台,发现在读取到请求正文末尾时,while循环未跳出,也不继续执行循环体,如果此时关闭网页则可以结束循环,问题可能比较基础,还望大神们能够帮忙解惑,谢谢!
public class Server {
private ServerSocket server;
/**
* 开启服务器
*/
public void start() {
try {
// 新建服务器后等待客户端连接
// 对应访问地址为:http://localhost:8888/
server = new ServerSocket(8888);
acceptClient();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 连接客户端
*/
private void acceptClient() {
try {
// 等待客户端连接
Socket client = server.accept();
// 选择字节输入流进行读取
BufferedInputStream bis = new BufferedInputStream(
client.getInputStream()
);
// // 获取输入流字节的长度并创建对应的字节数组
// byte[] buffer = new byte[bis.available()];
// for (int i = 0; i < buffer.length; i ++){
// buffer[i] = (byte)bis.read();
// }
// // 去除请求中的空格,方便后续使用
// String request = new String(buffer,0,buffer.length).trim();
// 获取输入流字节的长度并创建对应的字节数组
StringBuilder sb = new StringBuilder();
byte[] buffer = new byte[10];
int len = 0;
while ((len = bis.read(buffer))!=-1){
String tmp = new String(buffer, 0, len);
System.out.println(tmp);
sb.append(tmp);
}
// 去除请求中的空格,方便后续使用
String request = sb.toString().trim();
System.out.println(request);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 关闭服务器
*/
public void stop(){
try {
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Server server = new Server();
server.start();
}
}