1.前言
最近在自己写一个简单的Tomcat,但是在访问图片资源的时候遇到了一个问题:图片无法正确在浏览器上显示(一片黑),然后查各种资料也没能解决,还好今天突然自己醒悟了,调着调着就好了。
2.几个易错点
1. 响应浏览器的响应报文要写对
StringBuilder sb = new StringBuilder();
sb.append("http/1.1 200 ok").append("\r\n");
sb.append("content-type: image/png\r\n");
sb.append("\n");
2. 通过流读取图片后写会浏览器时要注意
OutputStream out = accept.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(out);
bos.write(sb.toString().getBytes());
byte[] buffer = new byte[1024 * 10];
while ((len = fis.read(buffer)) != -1){
//一定要这样,边读边写出去
bos.write(buffer,0,len);
//保存到sb里面,然后再写,这样的话浏览器无法正常显示图片,是漆黑一片
//sb.append(new String(buffer,0,len));
}
bos.flush();
bos.close();
完整的代码
package com.test;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @Author: cxx
* @Date: 2018/6/20 15:20
*/
public class ServerTest {
private static int port = 8888;
private static Socket accept;
private static ServerSocket socket;
private static BufferedWriter bw;
public static void main(String[] args) throws Exception {
socket = new ServerSocket(port);
System.out.println("服务器开启,等待连接....");
while (true){
accept = socket.accept();
InputStreamReader r = new InputStreamReader(accept.getInputStream());
System.out.println("浏览器请求成功!");
BufferedReader br = new BufferedReader(r);
String readLine = br.readLine();
System.out.println("---------------------");
//打印请求消息
String filePath="log";
int i=0;
while(readLine != null && !readLine.equals("")){
System.out.println(readLine);
if (i==0){
String[] split = readLine.split(" ");
if (split[1].endsWith("html")) {
filePath += split[1];
}
}
i++;
readLine=br.readLine();
}
System.out.println("----------------------");
//发送响应请求
System.out.println(filePath);
writeHtml(filePath);
}
}
public static void writeHtml(String filePath) throws Exception{
if (!"log/aa.jpg".equals(filePath)){
filePath="log/aa.jpg";
}
FileInputStream fis = new FileInputStream(filePath);
int len=0;
StringBuilder sb = new StringBuilder();
sb.append("http/1.1 200 ok").append("\r\n");
sb.append("content-type: image/png\r\n");
sb.append("\n");
OutputStream out = accept.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(out);
bos.write(sb.toString().getBytes());
byte[] buffer = new byte[1024 * 10];
while ((len = fis.read(buffer)) != -1){
//一定要这样,边读边写出去
bos.write(buffer,0,len);
//保存到sb里面,然后再写,这样的话浏览器无法正常显示图片,是漆黑一片
//sb.append(new String(buffer,0,len));
}
bos.flush();
bos.close();
}
}
启动服务,然后访问自己对应图片路径即可。