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

常见客户端与服务端

  客户端:

    浏览器:IE

  服务端:

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

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

服务端原理

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

  

 1 package cn.ie_server;
 2
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.io.PrintWriter;
 6 import java.net.InetSocketAddress;
 7 import java.net.ServerSocket;
 8 import java.net.Socket;
 9
10 import cn.InetAdress.demo.InetAddressDemo2;
11
12 public class MyTomcat {
13
14     public static void main(String[] args) throws IOException {
15         //建立服务端的socket连接,监听9090端口
16         ServerSocket ss=new ServerSocket(9090);
17         //接收客户端发来的消息
18         Socket s=ss.accept();
19
20         System.out.println(s.getInetAddress().getHostAddress());
21
22         //获取客户端发送过来的请求
23         InputStream in=s.getInputStream();
24
25         byte [] buf=new byte[1024];
26
27         int len=in.read(buf);
28
29         String text=new String(buf,0,len,"utf-8");
30
31         System.out.println(text);
32         //向客户端发送一些数据
33         PrintWriter out=new PrintWriter(s.getOutputStream(),true);
34         out.println("<font color=‘red‘ size=‘7‘>欢迎光临</font>");
35         s.close();
36         ss.close();
37     }
38 }

  发送过来的请求是:

  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

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

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

客户端原理

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

 1 package cn.ie_server;
 2
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.io.ObjectInputStream.GetField;
 6 import java.io.PrintWriter;
 7 import java.net.Socket;
 8 import java.net.UnknownHostException;
 9
10 public class MyBrowser {
11
12     /**
13      * @param args
14      * @throws IOException
15      * @throws UnknownHostException
16      */
17     public static void main(String[] args) throws UnknownHostException, IOException {
18         Socket s=new Socket("192.168.1.127",8080);
19
20         //模拟浏览器给tomcat服务端发送符合http协议的请求消息
21         PrintWriter out=new PrintWriter(s.getOutputStream(),true);
22         out.println("GET /docs/aio.html HTTP/1.1");
23         out.println("Accept: */*");
24         out.println("Host: 192.168.1.127:8080");
25         out.println("Connection:close");
26         out.println();
27         out.println();
28
29         InputStream in=s.getInputStream();
30         byte[] buf=new byte[1024];
31         int len=in.read(buf);
32
33         String str=new String(buf,0,len);
34         System.out.println(str);
35
36         s.close();
37
38     }
39
40 }

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

(应答行 应答状态码 应答状态行描述信息)
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这个类。

 1 package cn.ie_server;
 2
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.io.OutputStream;
 6 import java.net.MalformedURLException;
 7 import java.net.URL;
 8 import java.net.URLConnection;
 9
10 public class URLDemo {
11
12     /**
13      * @param args
14      * @throws IOException
15      */
16     public static void main(String[] args) throws IOException {
17         String str_url="http://127.0.0.1:8080/myweb/1.html?name=zhangsan";
18
19         URL url=new URL(str_url);
20                 InputStream in=url.openStream();
21                 byte[]buf=new byte[1024];
22         int len =in.read(buf);
23         String text=new String(buf ,0,len);
24         System.out.println(text);
25         in.close();
26     }
27
28 }

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

时间: 2024-10-20 23:53:10

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

Java网络编程(客户端和服务端原理)

浏览器端输入自己主机的IP地址+端口号(8888),会看到服务器返回的数据内容,Eclipse控制台会打印显示收到的信息, 通过我们自定义的服务器,可以看到浏览器端向服务器发送的请求信息的格式是: 请求行....... GET / HTTP/1.1  请求方式  /myweb/1.html  请求的资源路径   http协议版本.请求消息头 . 属性名:属性值 eclipse的控制台的输出: 192.168.2.103....connected//这个是我自己程序的输出GET / HTTP/1.

Java网络编程【Socket服务端和客户端】

Socket 编程大家都不陌生,Java 学习中必学的部分,也是 Java网络编程核心内容之一.Java 网络编程又包括 TCP.UDP,URL 等模块.TCP 对应 Socket模块,UDP 对应 DatagramPacket 模块.URL 对应 URL 模块.其中 TCP 和 UDP 是网络传输协议,TCP 是数据流传输协议,UDP 是数据包传输协议.两者之间的异同就不在这里说了,推荐一本入门书籍 <TCPIP入门经典>.我们开始 Socket 服务端和客户端编程吧. 一.Socket 服

[javaSE] 网络编程(TCP服务端客户端互访阻塞)

客户端给服务端发送数据,服务端收到数据后,给客户端反馈数据 客户端: 获取Socket对象,new出来,构造参数:String的ip地址,int的端口号 调用Socket对象的getOutputStream()方法,获取到OutputStream对象 调用OutputStream对象的write()方法,输出流输出数据,参数:byte[]字节数组 调用Socket对象的getInputStream()方法,获取到InputStream对象 调用InputStream对象的read()方法,读取数

Python socket编程客户端与服务端通信

目标:实现客户端与服务端的socket通信,消息传输. 客户端 客户端代码: from socket import socket,AF_INET,SOCK_STREAM #服务端的ip地址 server_ip = '127.0.0.1' #服务端socket绑定的端口号 server_port = 20000 if __name__ == '__main__': while True: str_msg = input("请输入要发送信息:") if str_msg != "&

网络编程——实现迭代服务端/客户端

给出<TCP/IP网络编程>第四章源码示例. 服务端: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #define BUF_SIZE 1024 void ErrorHandling(char *message) { f

11.网络编程:socket、服务端、客户端

socket: socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求. python中使用socket来进行网络连接传输 由图可知: socket中客户端需要进行的操作是:建立,连接,传输数据 ,接收数据,关闭连接 服务端需要进行的操作是:建立,绑定IP地址和端口,等待连接,接收数据,传输数据 ,关闭连接 服务端: 建立:socket.socket() 绑定端口:bind(('IP地址',端口)),其中地址和端口号是一个 tuple

Java网络编程 - 客户端向服务器端发送文件的简单实现

1.Client package cn.qi.Client; import java.io.*; import java.net.Socket; public class Client { Socket clientSocket; Client() { // 建立连接到服务器端的socket try { clientSocket = new Socket("127.0.0.1", 5000); } catch (IOException e) { e.printStackTrace();

Java网络编程:IP地址和端口号

1)IP地址 用来标志网络中的一个通信实体的地址.通信实体可以是计算机,路由器等. 2)IP地址分类 IPV4:32位地址,以点分十进制表示,如192.168.0.1 IPV6:128位(16个字节)写成8个16位的无符号整数,每个整数用四个十六进制位表示,数之间用冒号(:)分开,如:3ffe:3201:1401:1280:c8ff:fe4d:db39:1984 3)特殊的IP地址 127.0.0.1 本机地址 192.168.0.0--192.168.255.255私有地址,属于非注册地址,专

一站式学习Java网络编程 全面理解BIO/NIO/AIO完整版

一站式学习Java网络编程 全面理解BIO/NIO/AIO 资源获取链接:点击获取完整教程 网络层编程,是每一个开发者都要面对的技术.课程为解决大家学习网络层知识的难题,以创新性的“对比式学习”搭建网络编程课程,课程主线清晰(网络层基础铺垫-->java网络编程前置技术讲解-->阻塞式编程BIO-->非阻塞式编程NIO-->异步编程AIO-->综合实战)适合每一位需要理解网络编程的同学们学习.以“项目驱动”为导向的学习,与企业刚需灵魂契合. 适合人群 网络编程作为编程者的必备