模拟界面请求到web服务器
客户端
package com.lsw.client; import java.io.*;
import java.net.*;
import java.util.*; public class HTTPClinet {
public static void main(String[] args){
//确定http请求的uri
String uri = "index.html";
if(args.length !=0)
uri = args[0]; //按照get请求方式访问httpserver
doGet("localhost",8080,uri);
}
//按照get请求方式访问httpserver
public static void doGet(String host,int port,String uri){
Socket socket = null; try{
//与httpserver建立ftp连接
socket = new Socket(host,port);
}
catch(Exception e){
e.printStackTrace();
} try{
//创建http请求
//http请求的第一行
StringBuffer sb = new StringBuffer("GET "+uri+" HTTP/1.1\r\n");
//http请求头
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:8080\r\n");
sb.append("Connection: Keep-Alive\r\n\r\n"); //发送http请求
OutputStream socketOut = socket.getOutputStream(); //获得输出流
socketOut.write(sb.toString().getBytes()); //睡眠2秒,等待响应结果
Thread.sleep(2000); //接收响应结果
InputStream socketIn = socket.getInputStream(); //获得输入流
int size = socketIn.available();
byte[] buffer = new byte[size];
socketIn.read(buffer);
String request = new String(buffer);
System.out.println(request);
}
catch(Exception e){
e.printStackTrace();
}
finally{
try{
socket.close();
}catch(Exception e){
e.printStackTrace();
}
}
} }
服务端
package com.lsw.server; import java.io.*;
import java.net.*; public class HTTPServer {
public static void main(String[] args){
int port;
ServerSocket serverSocket; try{
port = Integer.parseInt(args[0]);
System.out.println("默认端口是: " + port);
}
catch(Exception e){
System.out.println("默认端口8080");
port = 8080;
} try{
//创建监听端口
serverSocket = new ServerSocket(port);
System.out.println("服务器正在监听端口: " + serverSocket.getLocalPort());
while(true){
try{
//等待客户的链接请求
final Socket socket = serverSocket.accept();
System.out.println("建立了一个与客户的新的TCP连接,该客户的地址为: " + socket.getInetAddress()
+ " 端口为 : " + socket.getPort());
//响应客户请求
service(socket);
}
catch(Exception e){
e.printStackTrace();
}
} }
catch(Exception e){
e.printStackTrace();
}
} public static void service(Socket socket) throws Exception{
//读取HTTP请求信息
InputStream socketIn = socket.getInputStream(); //获得输入流
//睡眠500毫秒,等待http请求
Thread.sleep(500);
int size = socketIn.available();
byte[] buffer = new byte[size];
socketIn.read(buffer);
String request = new String(buffer);
//打印http请求数据
System.out.println("客户端请求的数据为: " +request); //解析http请求
//获得http请求第一行
String firstLineOfRequest = request.substring(0,request.indexOf("\r\n"));
System.out.println("firstLineOfRequest= " +firstLineOfRequest);
//解析http请求的第一行
String[] parts = firstLineOfRequest.split(" ");
//解析http请求这种的uri
String uri = parts[1];
System.out.println("解析http请求这种的uri=" + uri);
System.out.println("截图的值为=" + uri.substring(0, 1).toString());
String flag = uri.substring(0, 1).toString();
if(flag.equals("/")){
System.out.println("此请求是从浏览器发起的请求");
uri = uri.substring(1).toString();
} System.out.println("解析http请求这种的uri=" + uri); //决定http响应正文的类型,此处作了简化处理
String contentType;
if(uri.indexOf("html") != -1 || uri.indexOf("htm") != -1)
contentType ="text/html";
else if(uri.indexOf("jpg") != -1 || uri.indexOf("jpeg") != -1)
contentType ="image/jpeg";
else if(uri.indexOf("gif") != -1)
contentType ="image/gif";
else
contentType = "application/octet-stream"; //字节流类型 //创建http响应结果
//创建http响应的第一行
String responseFirstLine = "HTTP/1.1 200 OK\r\n";
//http响应头
String responseHeader = "Content-Type:" +contentType + "\r\n\r\n";
//获得读取响应正文数据的输入流
/*InputStream in = HTTPServer.class.getResourceAsStream(uri); 书上这么写的 哎*/
InputStream in = HTTPServer.class.getClassLoader().getResourceAsStream(uri); //发送http响应结果
OutputStream socketOut = socket.getOutputStream(); //获得输出流
//发送http响应的第一行
socketOut.write(responseFirstLine.getBytes());
//发送http响应的头
socketOut.write(responseHeader.getBytes());
System.out.println("报文头发送完成");
System.out.println("开始发送http响应的正文");
//发送http响应的正文
int len = 0;
buffer = new byte[1024];
try {
while((len=in.read(buffer)) != -1)
socketOut.write(buffer, 0, len); } catch (Exception e) {
e.printStackTrace();
}
System.out.println("完成发送http响应的正文");
//睡眠1秒,等待客户接收http响应结果
Thread.sleep(1000);
//关闭tcp连接
socket.close(); } }
<!DOCTYPE html>
<html>
<head>
<title>hello.html</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8"> <!--<link rel="stylesheet" type="text/css" href="./styles.css">--> </head> <body>
This is my HTML page. <br>
</body>
</html>
模拟界面请求到web服务器的更多相关文章
- 您的请求在Web服务器中没有找到对应的站点”这是什么原因?出现这个界面说明域名解析已经正确并生效,这是由于域名没有绑定好,
宝塔出现 您的请求在Web服务器中没有找到对应的站点"这是什么原因?出现这个界面说明域名解析已经正确并生效,这是由于域名没有绑定好 , 本人经过测试使用如下方法解决.允话空HTTP_REFE ...
- js_html_input中autocomplete="off"在chrom中失效的解决办法 使用JS模拟锚点跳转 js如何获取url参数 C#模拟httpwebrequest请求_向服务器模拟cookie发送 实习期学到的技术(一) LinqPad的变量比较功能 ASP.NET EF 使用LinqPad 快速学习Linq
js_html_input中autocomplete="off"在chrom中失效的解决办法 分享网上的2种办法: 1-可以在不需要默认填写的input框中设置 autocompl ...
- C#模拟httpwebrequest请求_向服务器模拟cookie发送
使用C#代码模拟web请求,是一种常用的方法,以前没专门整理过,这里暂时贴上自己整理的完整代码,以后再做梳理: public class MyRequest { #region 辅助方法 public ...
- C#中使用Socket请求Web服务器过程
最开始我们需要明白一件事情,因为这是这篇文章的前提: HTTP协议只是一个应用层协议,它底层是通过TCP进行传输数据的.因此,浏览器访问Web服务器的过程必须先有“连接建立”的发生. 而有人或许会问: ...
- 详谈socket请求Web服务器过程
最开始我们需要明白一件事情,因为这是这篇文章的前提: HTTP协议只是一个应用层协议,它底层是通过TCP进行传输数据的.因此,浏览器访问Web服务器的过程必须先有“连接建立”的发生. 而有人或许会问: ...
- 详谈socket请求Web服务器过程(转)
最开始我们需要明白一件事情,因为这是这篇文章的前提: HTTP协议只是一个应用层协议,它底层是通过TCP进行传输数据的.因此,浏览器访问Web服务器的过程必须先有“连接建立”的发生. 而有人或许会问: ...
- 【网络开发】详谈socket请求Web服务器过程
最开始我们需要明白一件事情,因为这是这篇文章的前提: HTTP协议只是一个应用层协议,它底层是通过TCP进行传输数据的.因此,浏览器访问Web服务器的过程必须先有"连接建立"的发生 ...
- 自己动手模拟开发一个简单的Web服务器
开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此事要躬行”,于是我们自己模拟一个简单的W ...
- 一个简单的Web服务器-支持Servlet请求
上接 一个简单的Web服务器-支持静态资源请求,这个服务器可以处理静态资源的请求,那么如何处理Servlet请求的呢? 判断是否是Servlet请求 首先Web服务器需要判断当前请求是否是Servle ...
随机推荐
- 【转载】 深度学习与自然语言处理(1)_斯坦福cs224d Lecture 1
版权声明:本文为博主原创文章,未经博主允许不得转载. 原文地址http://blog.csdn.net/longxinchen_ml/article/details/51567960 目录(?)[- ...
- python学习笔记3-函数的递归
递归就是指自己函数的自我调用 #递归 #自己调用自己,函数的循环 def test1(): num = int(input('please enter a number:')) if num%2==0 ...
- 学号20155311 2016-2017-2 《Java程序设计》第7周学习总结
学号20155311 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 时间的度量 格林威治时间,简称GMT时间,由观察太阳而得来:世界时,UT:国际原子时,T ...
- 简明Python教程 ~ 随书笔记
本文是阅读<简明Python教程>所做的随书笔记,主要是记录一些自己不熟悉的用法,或者所看到的比较有意思的内容,本书英文版A Byte of Python, 中文译版 简明Python教程 ...
- 【方法】纯jQuery实现星巴克官网导航栏效果
前言 大冬天的没得玩,只能和代码玩. 所以就无聊研究了一下星巴克官网,在我看来应该是基本还原吧~ 请各位大神指教! 官网效果图 要写的就是最上方的会闪现的白色条条 效果分析 1.在滚动条往下拉到一定距 ...
- c++ new 和delete
c++中new和delete的使用方法 new和delete运算符用于动态分配和撤销内存的运算符 new用法: 1. 开辟单变量地址空间 1)new int; //开辟一个存放数组的存储空间 ...
- [转]closed-form solution (闭合解/解析解)和数值解的理解
参考整理自:http://hi.baidu.com/cjb366/item/7290773b2d2eb9f2a9842873 closed-form solution :一般翻译为闭合解/解析解.这一 ...
- JS合并单元格
在Web中经常需要合并单元格,例如对于下面一个表格: <!DOCTYPE html> <html> <head> <meta charset="UT ...
- Shell-判断条件总结
-b file 若文件存在且是一个块特殊文件,则为真 -c file 若文件存在且是一个字符特殊文件,则为真 -d file 若文件存在且是一个目录,则为真 -e file 若文件存在,则为真 -f ...
- 82.Linux之VMware10.0.4_x64安装
一直想写linux前期软件的一些安装配置的博客,因为中途去弄CORDIC算法了,今天上午刚弄好,除法,乘累加,三角函数等都能达到要求,所以现在来写这块的博客,CORDIC博客就不写了,因为网上很多.V ...