JAVA套接字创建HTTP客户与服务器程序

package server;
import java.io.*;
import java.net.*;

/**
 * @version 2013-11-15
 * @author cy
 * 实现一个http服务器,接收客户端的http请求,打印到控制台,然后解析请求,向客户端返回相应
 */
public class HTTPServer {

	public static void main(String[] args)
	{
		//端口号
		int port;
		
		ServerSocket serverSocket;
		
		try{
		port = Integer.parseInt(args[0]);
		}catch(Exception e){
			//默认端口号
			port = 8880;
			System.out.println("port = 8880(默认)");
		}
		
		try{
			serverSocket = new ServerSocket(port);
			System.out.println("服务器正在监听端口:"+serverSocket.getLocalPort());
			
			//不断接收客户端的http请求
			while(true){
				try{
					//等待客户端的TCP请求连接
					final Socket socket = serverSocket.accept();
					System.out.println("建立了与客户端的一个新的TCP连接,该客户的地址为:"+socket.getInetAddress()+":"+socket.getPort());
					//响应客户端请求
					HTTPServer.service(socket);
				}catch(Exception e)
				{
					e.printStackTrace();
				}
			}
		}catch(Exception e)
		{
			e.printStackTrace();
		}
		
	}
	
	/**
	 * 相应客户端的请求
	 * @param socket 传入的套接字
	 * @throws Exception
	 */
	public static void service(Socket socket) throws Exception{
		
		//获得输入流
		InputStream socketIn = socket.getInputStream();
		Thread.sleep(500);
		int size = socketIn.available();
		byte[] buffer = new byte[size];
		socketIn.read(buffer);
		String request = new String(buffer);
		//打印请求
		System.out.println(request);
		
		/*
		 * 解析http请求
		 */
		String firstLineOfRequest = request.substring(0,request.indexOf("\r\n"));
		
		String[] parts = firstLineOfRequest.split(" ");
		String url = parts[1];
		
		String contentType;
		if(url.indexOf("html") != -1 || url.indexOf("htm") != -1)
			contentType = "text/html";
		else if(url.indexOf("jpg") != -1 || url.indexOf("jpeg") != -1)
			contentType = "image/jpeg";
		else if(url.indexOf("gif") != -1)
			contentType = "image/gif";
		else
			//省略其他类型
			contentType = "application/octet-stream";
		
		//http响应第一行
		String responseFirstLine = "HTTP/1.1 200 ok\r\n";
		//响应头
		String responseHeader = "Content-Type:"+ contentType + "\r\n\r\n";
		//获得读取响应正文数据的输入流
		InputStream in = HTTPServer.class.getResourceAsStream("root/"+url);
		
		OutputStream socketOut = socket.getOutputStream();
		
		socketOut.write(responseFirstLine.getBytes());
		
		socketOut.write(responseHeader.getBytes());
		
		int len =0;
		buffer = new byte[128];
		while((len = in.read(buffer)) != -1)
		{
			socketOut.write(buffer,0,len);
		}
		
		Thread.sleep(1000);
		socket.close();
	}
}
package client;

import java.net.*;
import java.io.*;
import java.util.*;

public class HTTPClient {
	public static void main(String[] args) {
		String url = "index.htm";
		if (args.length != 0)
			url = args[0];
		doGet("localhost", 8880, url);
	}

	public static void doGet(String host, int port, String url) {
		Socket socket = null;

		try {
			socket = new Socket(host, port);
		} catch (Exception e) {
			e.printStackTrace();
		}

		try {
			/* 按照GET请求方式访问HTTPServer */
			StringBuffer sb = new StringBuffer("GET" + " " + url + " "
					+ "HTTP/1.1\r\n");

			sb.append("Accept: */*\r\n");
			sb.append("Accept-Language: zh-cn\r\n");
			sb.append("Accept-Encoding: gzip,deflate\r\n");
			sb.append("User-Agent: HTTPClient\r\n");
			sb.append("Host: localhost:8880\r\n");
			sb.append("Connection: Keep-Alive\r\n\r\n");

			OutputStream socketOut = socket.getOutputStream();
			socketOut.write(sb.toString().getBytes());

			Thread.sleep(2000);
			InputStream socketIn = socket.getInputStream();
			int size = socketIn.available();
			byte[] buffer = new byte[size];
			socketIn.read(buffer);
			System.out.println(new String(buffer, "UTF-8"));

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				socket.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}













  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值