您的位置:首页 > 理论基础 > 计算机网络

Java中实现HTTP网络通信(1.1)

2016-03-15 09:14 1021 查看
编写http1.1 客户端程序:

能够与服务器建立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();
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: