模拟界面请求到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 ...
随机推荐
- jquery radio的操作
radio 按钮组, name=”sex”. <input type="radio" name="sex" value="Male"& ...
- PyQt4 里的表格部件的使用方法: QTableWidget
PyQt4 里的表格部件的使用方法: QTableWidget QT下QTableWidget使用方法小结 - - 博客频道 - CSDN.NET http://blog.csdn.net/jingz ...
- RulersGuides.js – 网站中实现 Photoshop 标尺效果
RulersGuides.js 是一个 JavaScript 库,在网页上添加类似 Photoshop 中的标尺和辅助网格线.要创建创建网格线线,请单击垂直或水平的标尺,然后推动就可以.还可以使用相应 ...
- thinkphp 原数据更新
调用TP的save方法更新数据时,如果新数据与数据库中得数据一致, 那么执行M('table')->save(data)方法时,该方法会返回false.现在的需求是,哪怕用户要更新的数据与原数据 ...
- Anaconda+django写出第一个web app(三)
前面我们已经建立了模型Tutorial,也已经可以用Navicat Premium打开数据看查看数据,接下来我们通过建立admin账户来上传数据. 在命令行执行如下命令来创建用户: python ma ...
- [译] 用HTML5捕获音频和视频
原文地址:http://www.html5rocks.com/en/tutorials/getusermedia/intro/ 概述 有了HTML5,我们就可以在不借助Flash或者Silverlig ...
- ES6简单总结
1.变量声明let和const 我们都是知道在ES6以前,var关键字声明变量.无论声明在何处,都会被视为声明在函数的最顶部(不在函数内即在全局作用域的最顶部).这就是函数变量提升例如: functi ...
- Spring4笔记9--Spring的事务管理(AOP应用的例子)
Spring的事务管理: 事务原本是数据库中的概念,在 Dao 层.但一般情况下,需要将事务提升到业务层,即 Service 层.这样做是为了能够使用事务的特性来管理具体的业务. 在 Spring ...
- linux快速复制大量小文件方法 nc+tar【转】
1,在需要对大量小文件进行移动或复制时,用cp.mv都会显得很没有效率,可以用tar先压缩再解压缩的方式. 2,在网络环境中传输时,可以再结合nc命令,通过管道和tcp端口进行传输. nc和tar ...
- 工作常用shell集合
<1>日志回滚案例======>[root@localhost test]# cat hbase.sh hbase_rotate_log () { log=$1; ...