6

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

 3 years ago
source link: https://arminli.com/java-socket-http/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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);
	}

}

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK