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. [Mail] [RSS]