java网络编程客户端与服务端原理以及用URL解析HTTP协议

常见客户端与服务端

  客户端:

    浏览器:IE

  服务端:

    服务器:web服务器(Tomcat),存储服务器,数据库服务器。

(注:会用到Tomact服务器,在webapps下有一个自己创建的目录myweb,下面有一个文件1.html)

java网络编程客户端与服务端原理以及用URL解析HTTP协议

服务端原理

  自定义一个服务端,使用自己已有的客户端IE浏览器,了解一下客户端都发送了什么请求。

  

 package cn.ie_server;

 import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket; import cn.InetAdress.demo.InetAddressDemo2; public class MyTomcat { public static void main(String[] args) throws IOException {
//建立服务端的socket连接,监听9090端口
ServerSocket ss=new ServerSocket(9090);
//接收客户端发来的消息
Socket s=ss.accept(); System.out.println(s.getInetAddress().getHostAddress()); //获取客户端发送过来的请求
InputStream in=s.getInputStream(); byte [] buf=new byte[1024]; int len=in.read(buf); String text=new String(buf,0,len,"utf-8"); System.out.println(text);
//向客户端发送一些数据
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
out.println("<font color='red' size='7'>欢迎光临</font>");
s.close();
ss.close();
}
}

  发送过来的请求是:

  GET / HTTP/1.1 (请求行: 请求方式 请求资源路径/myweb/1.html http协议版本)
  (请求消息头,属性名:属性值 )
  Accept: text/html, application/xhtml+xml, image/jxr, */*
  Accept-Language: zh-Hans-CN,zh-Hans;q=0.8,en-US;q=0.5,en;q=0.3
  User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)   Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586
  (支持的压缩方式)
  Accept-Encoding: gzip, deflate
  Host: 127.0.0.1:9090
  Connection: Keep-Alive8

注意:这此时开放端口后可能会连不上服务端出现以下情况

java网络编程客户端与服务端原理以及用URL解析HTTP协议

此时可以试一下将ip换成127.0.0.1 这个回送地址,因为如果在校园会出现访问限制的情况

客户端原理

  服务端给客户端的应答消息,模拟一个Tomcat服务端发送符合http协议的请求消息

 package cn.ie_server;

 import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream.GetField;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException; public class MyBrowser { /**
* @param args
* @throws IOException
* @throws UnknownHostException
*/
public static void main(String[] args) throws UnknownHostException, IOException {
Socket s=new Socket("192.168.1.127",8080); //模拟浏览器给tomcat服务端发送符合http协议的请求消息
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
out.println("GET /docs/aio.html HTTP/1.1");
out.println("Accept: */*");
out.println("Host: 192.168.1.127:8080");
out.println("Connection:close");
out.println();
out.println(); InputStream in=s.getInputStream();
byte[] buf=new byte[1024];
int len=in.read(buf); String str=new String(buf,0,len);
System.out.println(str); s.close(); } }

  服务端返回的应答消息为:

(应答行 应答状态码 应答状态行描述信息)
HTTP/1.1 200 OK
(应答消息属性 属性名:属性值 )
Server: Apache-Coyote/1.1
Accept-Ranges: bytes
ETag: W/"24874-1465990848000"
Last-Modified: Wed, 15 Jun 2016 11:40:48 GMT//最后修改时间
Content-Type: text/html
Content-Length: 24874
Date: Mon, 04 Jul 2016 14:54:43 GMT
Connection: close
//空行
//应答体

<html>
<head>
<title>这是我的网页</title>
</head>

<body>

<h1>欢迎光临</h1>

<font size='5' color="red">这是一个Tomcat服务器中的资源。这是一个html网页。</font>

</body>

</html>

注意:通常我们找不到网页,会出现404的应答状态码,而成功的话会返回200的应答状态码。

  大家可以看到服务端返回的消息中有“应答行 应答状态码 应答状态行描述信息”等等一系列信息,但为什么在浏览器中只有我们看到的普通网页呢,这是因为浏览器进行了解析,但是怎么解析呢?只是就用到了URL这个类。

 package cn.ie_server;

 import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection; public class URLDemo { /**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
String str_url="http://127.0.0.1:8080/myweb/1.html?name=zhangsan"; URL url=new URL(str_url);
InputStream in=url.openStream();
byte[]buf=new byte[1024];
int len =in.read(buf);
String text=new String(buf ,0,len);
System.out.println(text);
in.close();
} }

整理的有些粗糙,大家多提一下建议哈。

上一篇:在ASP.NET非MVC环境中(WebForm中)构造MVC的URL参数,以及如何根据URL解析出匹配到MVC路由的Controller和Action


下一篇:域名解析中的cname解析和显性URL跳转和隐性URL跳转三者有什么区别