Java中实现HTTP网络通信(1.1)
2016-03-15 09:14
1021 查看
编写http1.1 客户端程序:
能够与服务器建立TCP连接,并且把服务器的内容保存到一个文件中。
能够与服务器建立TCP连接,并且把服务器的内容保存到一个文件中。
package com.itzhewei.httpclinet; import java.io.BufferedReader; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; public class HttpClinet { private static final int port=8888; public static void main(String[] args) { Socket s=null; try { //// System.out.println("请输入你要得到的文件:"); Scanner scanner=new Scanner(System.in); /// String filename=scanner.next(); //连接服务器 s=new Socket("localhost",port); //发送请求头 PrintStream writer=new PrintStream(s.getOutputStream()); writer.println("GET /"+filename+" HTTP/1.1"); writer.println("Host:localhost"); writer.println("connection:keep-alive"); writer.println(); writer.flush(); //发送请求体 ////// //接受响应状态 响应成功(状态吗200)--保存资源到本地磁盘 //跳过响应中的前四行,开始读取相应的数据 InputStream in=s.getInputStream(); BufferedReader reader=new BufferedReader(new InputStreamReader(s.getInputStream())); String firstLineOfResponse=reader.readLine();//HTTP/1.1 200 ok String secondLineOfResponse=reader.readLine(); String threeLineOfResponse=reader.readLine(); String fourLineOfResponse=reader.readLine(); System.out.println(firstLineOfResponse); System.out.println(secondLineOfResponse); System.out.println(threeLineOfResponse); System.out.println(fourLineOfResponse); System.out.println("文件已经传输完毕"); //读取响应文件,保存数据 //success byte[] b=new byte[1024]; OutputStream out=new FileOutputStream("C:/Users/john/workspace/HttpClinet"+"/"+filename); int len=in.read(b); while(len!=-1){ out.write(b,0,len); len=in.read(b); } in.close(); out.close(); //响应失败,(状态吗404)-将响应信息打印在控制台上 //output error message StringBuffer result=new StringBuffer(); String line=reader.readLine(); while(line!=null){ result.append(line); } reader.close(); System.out.println(result); } catch (Exception e) { e.printStackTrace(); } } }
简单的HTTP1.1服务器:
package com.itzhewei.htttpserver; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class HttpServer { private static final int port=8888; public static void main(String[] args) { //启动ServerSocket监听到客户端的连接, ServerSocket ss=null; Socket s=null; try { ss=new ServerSocket(port); while(true){ s=ss.accept(); TaskThread t=new TaskThread(s); t.start(); } } catch (IOException e) { e.printStackTrace(); }finally { try { ss.close(); } catch (IOException e) { e.printStackTrace(); } } } }
package com.itzhewei.htttpserver; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; public class TaskThread extends Thread{ private Socket s; public TaskThread(Socket s) { this.s=s; } public void run() { try { BufferedReader reader=new BufferedReader(new InputStreamReader(s.getInputStream())); PrintWriter writer=new PrintWriter(new OutputStreamWriter(s.getOutputStream())); String firstLineOfRequest; firstLineOfRequest=reader.readLine();//得到客户端发送的第一行数据 String uri=firstLineOfRequest.split(" ")[1]; //根据客户端请求的文件的后缀名发送响应类型 writer.println("HTTP/1.1 200 ok"); writer.flush(); if(uri.endsWith(".html")){ writer.println("Content-type:text.html"); writer.flush(); } else if(uri.endsWith(".jpg")){ writer.println("Content-type:image.jpg"); writer.flush(); } else{ writer.println("Content-type:application/octet-stream"); writer.flush(); } FileInputStream in=new FileInputStream("C:/Users/john/workspace/HttpServer"+uri); // if(in.) //发送响应头 writer.println("Content-Length:"+ in.available());//返回内容字节数 writer.println();//根据http协议,空行将结束头信息 writer.flush(); //发送响应数据: //d发送响应体 OutputStream os=s.getOutputStream(); byte[] b=new byte[1024]; int len=0; len=in.read(b); while(len!=-1){ os.write(b,0,len); len=in.read(b); } os.flush(); //当球球文件不存在的时候,发送纯文本的响应信息 //发送响应头 writer.println("HTTP/1.1 404 Not Found"); writer.println("Cotent-type:text/plain"); writer.println("Cotent-Length:7"); writer.println(); writer.print("访问内容不存在"); writer.flush(); } catch (IOException e) { e.printStackTrace(); } } }
相关文章推荐
- HttpClient自动请求服务器类的简单使用
- Netty4实战 - TCP粘包&拆包解决方案
- 自组织神经网络介绍:自组织特征映射SOM(Self-organizing feature Map),第三部分
- 自组织神经网络介绍:自组织特征映射SOM(Self-organizing feature Map),第三部分
- 自组织神经网络介绍:自组织特征映射SOM(Self-organizing feature Map),第三部分
- [HDU 4289]Control[网络流][拆点]
- Deep Learning模型之:CNN卷积神经网络(二) 文字识别系统LeNet-5
- TCP连接和断开
- HttpClient那些事儿
- 配置Tomcat使用https协议(配置SSL协议)
- Xcode7 使用NSURLSession发送HTTP请求报错
- Http Response Code
- C 实现一个简易的Http服务器
- Retrofit2.0源码分析
- win10 Hyper-v 网络配置
- linux服务器历险之sysctl优化linux网络
- [New learn] 网络基础-apache本地服务搭建(支持php)
- 解读TCP 四种定时器
- linux复习杂记(二) linux网络编程中的细节
- tcp三次握手都没有建立, 还谈什么业务包呢?------聊聊最近的一个扯皮问题