Java网络编程(五) —— HTTP服务端与客户端介绍

概述

服务器
开启tomcat服务器:他可以存储我们写好的webapp资源,然后tomcat相当于容器,并提供这个服务。

访问http://192.168.1.11 web服务默认是80端口
比如我配置了DNS列表,则我就可以访问http://www.djlf.com我可以把他配置成我想要的ip地址
访问我们自己创建的服务器最好指定端口号http://192.168.1.11:8080
http://192.168.1.11:8080/myweb/1.html 可以访问相应的资源
如果资源中包含其他资源,比如图片,那么有多少张图片就需要发送多少次请求。

浏览器和服务器运行原理

浏览器内部当然也是使用的Socket接口,的客户端程序。
类似于用java使用 Socekt s = new Socket("ip",8080);
而我们在TCP程序中,向服务端发送的是一个字符串。
但是浏览器发送的是什么内容呢?
我们可以测试一下:
比如就使用上一节中TCP服务端代码,开启服务器后,我们使用浏览器访问:
在这里插入图片描述

打印出来的这个,浏览器的请求,其实是一个http协议的请求头消息:

GET / HTTP/1.1      请求方式;请求路径;http版本
下面为请求消息中的属性信息
Host: 127.0.0.1:10006   
Connection: keep-alive  这是由http版本决定的
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36  浏览器的信息,包括版本和机器信息
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3  表示浏览器可以接受的文本格式*/*就是全部支持
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9     接受语言

以上信息就是请求头是标准信息,他的下面就是包含的请求体,中间空一行,下面为请求体,只是我们这里没有请求体。

所以我们可以模拟浏览器,发送一些http消息给Tomcat服务器。也就是说在我们的程序中,包含所有请求头的信息,这也就是浏览器所做的事情。

然后我们从tomcat服务器就可以获得到我们想要的资源,以下是tomcat服务器返回的应答头示例:

HTTP/1.0 200 OK  协议版本,响应状态码
Date:Mon,31Dec200104:25:57GMT 
Server:Apache/1.3.14(Unix)  服务器信息
Content-type:text/html 
Last-modified:Tue,17Apr200106:46:28GMT 
Etag:"a030f020ac7c01:1e9f" 
Content-length:39725426 
Content-range:bytes554554-40279979/40279980 

下面也可以包含响应体,这里我们为空。

所以这里我们就可以了解到浏览器和服务器都是干什么的,其实就是使用http协议发送请求头和请求体并获取返回的数据。然后可以加上图形化界面和解析,我们自己也可以做成一个类似谷歌浏览器和tomcat服务器都东西。

URL

http://192.168.1.11:8080/myweb/1.html
这是一个URL,他是URI的一种。
但是我们如何取出这里的ip地址目的端口和请求路径资源呢。当然我们可以使用正则或者分割来操作但是比较麻烦并容易出错。好在java帮我们实现并给我们提供了接口 直接可以调用,来获取URL中的信息,比如ip地址。
我们就可以写一个浏览器,使用URL的功能。而URL对象里面封装了socket,所以我们可以使用他作为客户端来连接服务器:

package network;

import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

public class URLparama {
    public static void main(String[] args) {
        try {
            String str_url = "http://127.0.0.1:10006/myweb/1.html?name=lily";

            URL url = new URL(str_url);
            System.out.println(url.getProtocol());//http
            System.out.println(url.getHost());//192.168.1.11
            System.out.println(url.getPort());//10006
            System.out.println(url.getPath());///myweb/1.html
            System.out.println(url.getFile());///myweb/1.html?name=lily
            System.out.println(url.getQuery());//name=lily

            //创建URLConnection对象,里面包含了socket
            URLConnection urlConnection = url.openConnection();
            System.out.println(urlConnection);//sun.net.www.protocol.http.HttpURLConnection:http://127.0.0.1:10006/myweb/1.html?name=lily

            //使用输入流开启接收服务器传回信息,这才算一个完整连接
            InputStream inputStream = urlConnection.getInputStream();

        } catch (Exception e) {

        }

    }
}

这时连接服务器之后,服务器可以打印请求头信息如下:

server is starting !!!
127.0.0.1 ...connected
GET /myweb/1.html?name=lily HTTP/1.1
User-Agent: Java/1.8.0_201
Host: 127.0.0.1:10006
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive

网络架构

C/S:

客户端服务器,都需要编写,自己写。
客户端可以分担部分运算。但是需要安装。

比如:网络游戏(3D建模)

B/S:

只需要编写服务端,因为客户端是浏览器。
客户端不需要运算,直接用现成的浏览器。运算效率很低,所以运算都要在服务端。

发布了103 篇原创文章 · 获赞 94 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/chongbin007/article/details/96625673