JAVA Socket编程:使用HTTP实现网络通信

March 22, 2016

功能

服务器功能

提供 HTML,JPG 等 MIME 类型的资源。

客户端功能

访问服务器,获取 HTML 和 JPG 资源,保存到本地磁盘。

预习内容:HTTP通信原理

 

服务器端代码

TaskThread.java

package httpServer;

import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Socket;

public class TaskThread extends Thread{ private Socket s; public TaskThread(Socket s){ this.s = s; } public void run(){ BufferedReader reader; PrintStream writer; FileInputStream in; DataOutputStream os; String firstLineOfRequest; try { reader = new BufferedReader(new InputStreamReader(s.getInputStream())); firstLineOfRequest = reader.readLine(); //System.out.println(firstLineOfRequest); String uri = firstLineOfRequest.split(” “)[1]; writer = new PrintStream(s.getOutputStream()); File file = new File(“D:/http”+uri); if(file.exists()){ writer.println(“HTTP/1.1 200 OK”);//返回应答消息,并结束应答 if(uri.endsWith(“.html”)) { writer.println(“Content-Type:text/html”); } else if(uri.endsWith(“.jpg”)) { writer.println(“Content-Type:image/jpeg”); }else { writer.println(“Content-Type:application/octet-stream”); } in = new FileInputStream(“D:/http”+uri); //发送响应头 writer.println(“Content-Lenth:“+in.available()); writer.println(); writer.flush(); //发送响应体 os = new DataOutputStream(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.close(); }else{ //发送响应头 writer.println(“HTTP/1.1 404 Not Found”); writer.println(“Content-Type:text/plain”); writer.println(“Content-Length:7”); writer.println(); //发送响应体 writer.print(“访问内容不存在”); writer.flush(); writer.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

server.java

package httpServer;

import java.io.IOException; import java.net.ServerSocket; import java.net.Socket;

public class server { public static void main(String[]args) { ServerSocket ss=null; try { ss=new ServerSocket(8888); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } while(true) { try { Socket s = ss.accept(); TaskThread t = new TaskThread(s); t.start(); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } } }

服务器端写完后可以启动后在浏览器中测试一下如:
输入 http://localhost:8888/login.html
输入 http://localhost:8888/ios.jpg

客户端代码

Client.java

package httpClient;

import java.io.BufferedReader; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner;

public class Client {

public static void main(String[] args) throws UnknownHostException, IOException {
	// TODO Auto-generated method stub
	Scanner scanner= new Scanner(System.in);
	//连接服务器
	Socket s = new Socket("localhost", 8888);
	//发送请求头
	PrintStream writer = new PrintStream(s.getOutputStream());
	System.out.println("请输入filename:");
	String filename = scanner.nextLine();
	writer.println("GET /"+filename+" HTTP/1.1");
	writer.println("Host:localhost");
	writer.println("connetion:keep-alive");
	writer.println();
	writer.flush();
	//接受响应状态
	InputStream in=s.getInputStream();
	BufferedReader reader=new BufferedReader(new InputStreamReader(in));
	String firstLineOfResponse = reader.readLine();
	String secondLineOfResponse = reader.readLine();
	String threeLineOfResponse = reader.readLine();
	if(firstLineOfResponse.endsWith("OK")) {
		System.out.println("开始传输\n");
		byte[] b = new byte[1024];
		FileOutputStream out= new FileOutputStream("D:/http/h"+"/"+filename);
		int len = in.read(b);
		while(len!=-1) {
			out.write(b,0,len);
			len=in.read(b);
		}
		System.out.println("传输完成\n");
		in.close();
		out.close();
	}
	else {
		//output error message
		System.out.println("该文件不存在\n");
		StringBuffer result = new StringBuffer();
		String line;
		while((line=reader.readLine())!=null) {
			result.append(line);
		}
		reader.close();
		System.out.println(result);
	}

}

}


Profile picture

Written by Armin Li , a venture capitalist. [Weibo] [Subscribe]