Discuss / Java / 用chrome等浏览器访问这个简单的helloworld网页会有一次Response Error

用chrome等浏览器访问这个简单的helloworld网页会有一次Response Error

Topic source

其实是浏览器对网站图标/favicon.ico的请求失败了

把代码改成

private void handle(InputStream input, OutputStream output) throws IOException {
		System.out.println("Process new http request...");
		var reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
		var writer = new BufferedWriter(new OutputStreamWriter(output, StandardCharsets.UTF_8));
		// 读取HTTP请求:
		int requestFlag = -1;
		String first = reader.readLine();
		if (first.startsWith("GET / HTTP/1.")) {
			requestFlag = 1;
		}
		if (first.startsWith("GET /favicon.ico HTTP/1.")) {
			requestFlag = 2;
		}
		for (;;) {
			String header = reader.readLine();
			if (header.isEmpty()) { // 读取到空行时, HTTP Header读取完毕
				break;
			}
			System.out.println(header);
		}
		System.out.println(requestFlag > 0 ? "Response OK" : "Response Error");
		switch (requestFlag) {
		case -1:
			writer.write("404 Not Found\r\n");
			writer.write("Content-Length: 0\r\n");
			writer.write("\r\n");
			writer.flush();
			break;
		case 1:
			// 发送成功响应:
			String data = "<html><body><h1>Hello, world!</h1></body></html>";
			int length = data.getBytes(StandardCharsets.UTF_8).length;
			writer.write("HTTP/1.0 200 OK\r\n");
			writer.write("Connection: close\r\n");
			writer.write("Content-Type: text/html\r\n");
			writer.write("Content-Length: " + length + "\r\n");
			writer.write("\r\n"); // 空行标识Header和Body的分隔
			writer.write(data);
			writer.flush();
			break;
		case 2:
			byte[] b = Server.class.getResourceAsStream("/favicon.png").readAllBytes(); //把图片放在bin下
			writer.write("HTTP/1.0 200 OK\r\n");
			writer.write("Connection: close\r\n");
			writer.write("Content-Type: image/x-icon\r\n");
			writer.write("Content-Length: " + b.length + "\r\n");
			writer.write("\r\n"); // 空行标识Header和Body的分隔
			writer.flush();
			output.write(b);
			output.flush();
			break;
		}
	}

并把图片放进项目文件夹下,就可以使浏览器正确获取图标

请问为什么添加了图片之后,网页上不会显示任何图标呢

以及为什么浏览器会自动请求一个图标呢?

问:请问为什么添加了图片之后,网页上不会显示任何图标呢?

答:你在浏览器里面收藏一下这个网址,然后去收藏夹看你收藏的这个网址,就能看到这个图片了。另外,你再仔细想想,即使浏览器拿到了图片,由于你的html里面没有写展示图片的代码,浏览器也不知道要给你展示到页面的哪个位置啊。浏览器只会展示html里面的内容,你html里面没有写展示图片的代码,当然不会显示了。

问:以及为什么浏览器会自动请求一个图标呢?

答:这是浏览器自己发出的请求,浏览器请求这个图标是为了,用户收藏这个网址的时候,在收藏夹里面显示这个网址的logo。favicon,即Favorites Icon的缩写,是其可以让浏览器的收藏夹中除显示相应的标题外,还以图标的方式区别不同的网站。你会发现有时候接到的是对于favico.ico的请求,而自己从来没有作出这个请求。这与浏览器的机制有关。 浏览器会在适当的时候(什么是适当时候,要看不同浏览器的机制),自动的向服务器发出这样的图片请求。当正常接收到图片后,用户收藏这个网站的网页时,就会在收藏夹显示相应的图片。

参见这里浏览器对于服务器favico.ico的请求问题

case 2:

            //readAllBytes这个方法jdk8没有,可以换成下面的代码。

            //byte[] b = Test.class.getResourceAsStream("/favicon.png").readAllBytes(); //把图片放在src或者bin目录下

            InputStream ins = Test.class.getResourceAsStream("/favicon.png");//把图片放在bin下

            byte[] b = new byte[1024];

            int res = 0;

            ByteArrayOutputStream outputByte = new ByteArrayOutputStream();

            while((res = ins.read(b)) != -1) {

                outputByte.write(b, 0, res);//将字节读取到字节内存流中outputByte

            }

            byte[] faviconByteArr =outputByte.toByteArray();//将读取到的字节转换成byte数组

            outputByte.close();

            ins.close();

            writer.write("HTTP/1.0 200 OK\r\n");

            writer.write("Connection: close\r\n");

            writer.write("Content-Type: image/x-icon\r\n");

            writer.write("Content-Length: " + faviconByteArr.length +"\r\n");

            writer.write("\r\n");//空行标识Header和Body的分隔

            writer.flush();

            System.out.println("长度是多少:" + faviconByteArr.length);

            output.write(faviconByteArr, 0, faviconByteArr.length);;

            output.flush();

            break;

SNH48-刘慈欣 ,你有微博或者公众号吗?想follow你,交个朋友。


  • 1

Reply