接着上回的代码进行讲解,上回的代码仅能传输文字信息,对图片信息没有办法传送,这次我们来补充传递图片信息的方法。
代码在上一次的代码中做了些修改
import java.io.*; import java.net.*; public class Java_web_test { public static void main(String args[]) throws IOException { ServerSocket tt=new ServerSocket(6699); while(true){ String rootpath=System.getProperty("user.dir")+File.separator+"静态网页"; Socket mt = tt.accept(); BufferedReader asd =new BufferedReader(new InputStreamReader(mt.getInputStream())); String m,d; m=asd.readLine(); d=m; System.out.println(d); while(asd.ready()){ m=asd.readLine(); System.out.println(m); } System.out.println(m); String[] array=d.split(" "); System.out.println(); File sll=new File(rootpath+array[1]); if(sll.isFile()){ BufferedInputStream mmt=new BufferedInputStream(new FileInputStream(rootpath+array[1]),206848);//这里使用InputStream而不是Reader主要是图片文件需要使用二进制流来进行读取(编码方式受限,二进制流比较稳妥) int wwt=mmt.available();//获得打开文件中的可读数据大小 byte[] qwer=new byte[wwt];//创建报文缓冲区 mmt.read(qwer);//将数据写入缓冲区 BufferedOutputStream ssd=new BufferedOutputStream(mt.getOutputStream()); StringBuffer n=new StringBuffer(); n.append("Http/1.1 200 OK \r\n\r\n"); int a=1,b=0; n.append(m); ssd.write(n.toString().getBytes()); ssd.write(qwer);//将缓冲区中数据写出输出流 System.out.println(n.toString()); ssd.flush(); } else{ BufferedWriter sdd=new BufferedWriter(new OutputStreamWriter(mt.getOutputStream())); sdd.write("Http/1.1 404 ERROR \r\n\r\n"); sdd.flush(); } mt.shutdownOutput(); mt.close(); } } }
这次的思路就是将Reader这种字符流读取(会强行对图片的二进制文件编码)的方法更替为字节流读取的方法,普适性更强