第1章-第10节
一、知识点
网络编程。
二、目标
-
理解前后端交互过程。
-
掌握网络编程的基本概念。
三、内容分析
-
重点
-
网络编程基本概念。
-
前后端交互过程。
-
-
难点
-
前后端交互过程。
-
四、内容
1、网络编程
网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。
2.1 软件结构
-
C/S结构
客户端——服务器
Client —— Server
客户端和服务器结构。如QQ、迅雷等。
-
B/S结构
浏览器——服务器
Browser——Server
浏览器和服务器结构。谷歌、火狐等。
2.2 网络通信协议
-
网络通信协议:通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则。在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据的交换。
-
TCP/IP协议:传输控制协议/因特网互联协议( Transmission Control Protocol/Internet Protocol),是Internet最基本、最广泛的协议。它定义了计算机如何连入因特网,以及数据如何在它们之间传输的标准。它的内部包含一系列的用于处理数据通信的协议,并采用了4层的分层模型,每一层都呼叫它的下一层所提供的协议来完成自己的需求。
2.3 网络编程三要素
2.3.1协议
计算机网络通信必须遵守的规则。
https比http更加安全,多了一个证书
2.3.2 IP地址
互联网协议地址(Internet Protocol Address),俗称IP。IP地址用来给一个网络中的计算机设备做唯一的编号。假如我们把“个人电脑”比作“一台电话”的话,那么“IP地址”就相当于“电话号码”。
-
分类
-
IPv4:是一个32位的二进制数,通常被分为4个字节,表示成
a.b.c.d
的形式,例如192.168.65.100
。其中a、b、c、d都是0~255之间的十进制整数,那么最多可以表示42亿个。 -
IPv6:由于互联网的蓬勃发展,IP地址的需求量愈来愈大,但是网络地址资源有限,使得IP的分配越发紧张。为了扩大地址空间,拟通过IPv6重新定义地址空间,采用128位地址长度,每16个字节一组,分成8组十六进制数,表示成
ABCD:EF01:2345:6789:ABCD:EF01:2345:6789
,号称可以为全世界的每一粒沙子编上一个网址,这样就解决了网络地址资源数量不够的问题。
ip -> 域名
192.168.1.1 -> www.baidu.com
IPv4不够用怎么办?
1.虚拟网络(局域网)
2.IPv6:多的用不完
-
常用命令【window+r】
-
查看本机IP地址,在cmd终端输入
ipconfig
-
检查网络是否连通,在cmd终端输入
ping 空格 IP地址 ping xxx.xx.xx.xx
-
特殊的IP地址
本机IP地址:127.0.0.1
、localhost
。
(环回ip)
2.3.3 端口号
网络的通信,本质上是两个进程(应用程序)的通信。每台计算机都有很多的进程,那么在网络通信时,如何区分这些进程呢?
如果说IP地址可以唯一标识网络中的设备,那么端口号就可以唯一标识设备中的进程(应用程序)了。
端口号:用两个字节表示的整数,它的取值范围是0~65535。其中,0~1023之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败。
2.3.4 总结
利用协议
+IP地址
+端口号
三元组合,就可以标识网络中的进程了,那么进程间的通信就可以利用这个标识与其它进程进行交互。
当我们在浏览器输入www.baidu.com时,浏览器自动加上协议http或者https,网址通过 DNS 域名解析获取IP地址,根据IP地址找到对应的服务器,再根据访问的端口号找到对应的服务,当我们没有写端口号时默认端口号是80,服务最后再响应内容返回给浏览器,最后浏览器接收到内容展示出来。
我们在访问一个域名/网址的时候本质还是根据IP去找服务器,域名只是方便我们记忆使用,所以我们在浏览器输入14.215.177.39:80进行访问,返回的结果和访问www.baidu.com时一样。
2.4 TCP通信程序
在Java中,提供了两个类用于实现TCP通信程序:
-
客户端:
java.net.Socket
类表示。创建Socket
对象,向服务端发出连接请求,服务端响应请求,两者建立连接开始通信。 -
服务端:
java.net.ServerSocket
类表示。创建ServerSocket
对象,相当于开启一个服务,并等待客户端的连接。
下面使用ServerSocket实现浏览器访问服务器的效果:
启动服务之后,使用浏览器访问 http://localhost:8080/login, 浏览器显示【登录成功】,
使用浏览器访问 http://localhost:8080/register, 浏览器显示【注册成功】。
解析:我们使用http协议进行访问服务器,访问IP地址是我们自己的电脑,即localhost;访问的程序是8080端口对应的程序,即ServerSocket开启的端口;我们再解析请求路径,根据不同的请求路径响应不同的内容。
public static void main(String[] args) throws IOException {
// 创建一个web服务对象(服务端),设置端口号为8080
ServerSocket server = new ServerSocket(8080);
while (true) {
try {
// 获取一个客户端对象,客户端传输过来的数据都在里面
Socket socket = server.accept();
System.out.println("服务端被请求了!!");
// 数据传输 => 获取输入流
InputStream input = socket.getInputStream();
//利用字节数组熟读数据
//int result;
//byte[] bt = new byte[1024];
//if ((result = input.read(bt)) != -1){
// System.out.println(new String(bt,0,result));
//}
//读取客户端内容并输出在控制台,转化为字符流进行操作
BufferedReader br = new BufferedReader(new InputStreamReader(input));
String path = br.readLine().split(" ")[1];
System.out.println(path);
// 获取输出流,给客户端响应内容
OutputStream outputStream = socket.getOutputStream();
//通信协议是1.1版本,200是状态码,\r\n是换行符
outputStream.write("HTTP/1.1 200 OK\r\n".getBytes());
// 返回的内容默认utf8(字符集编码)的数据,但是浏览器不知道
// 浏览器就会按照系统默认,中文系统编码GBK
// 使用GBK的编码去解析utf8的数据
outputStream.write("Content-type:text/html;charset=utf8\r\n".getBytes());
outputStream.write("\r\n".getBytes());
if("/login".equals(path)) {
outputStream.write("登录成功".getBytes());
} else if("/register".equals(path)) {
outputStream.write("注册成功".getBytes());
}
outputStream.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
标签:10,outputStream,浏览器,网络,IP地址,JavaSE,小结,端口号,客户端
From: https://blog.csdn.net/qq_40508161/article/details/142664059