JAVA套接字创建HTTP客户与服务器程序
2013-11-15 15:40
232 查看
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(); } } } }
相关文章推荐
- 黑马程序员:基于TCP协议的网络服务:ServerSocket、Socket
- 【ios 网络篇 2】 下载模块 -- 业务层
- Cocos2d-x 例子TestCPP —记录1
- 【ios 网络篇 1】 协议设计
- 社会化网络设计
- 第三方源码的网站 http://grepcode.com/
- 计算机网络自学之路------IP协议(1)
- 计算机网络自学之路------网络体系结构
- NPAPI-浏览器开发之网络文件SRC下载(NPN_GetURLNotify,NPP_NewStream....)
- 黑马程序员:UDP与TCP的区别
- Ajax跨域访问解决方案(httpclient、JSONP深入剖析)
- 【转】HTTP 304 的理解
- 黑马程序员:网络编程介绍:OSI参考模型、TCP/IP参考模型
- BT5配置网络
- HttpServletRequest对象的getAttribute()与getParameter()
- 光载无线交换机
- java发起HttpURLConnection和HttpsURLConnection请求
- linux TCP连接配置
- 计算机网络协议包头赏析-TCP
- SSRS:部署错误之“请求因 HTTP 状态 401 失败: Unauthorized。”