JavaSE基础(day21)(1)网络编程的常识 (2)基于tcp协议的编程模型(3)tcp协议和udp协议的比较 (4)基于udp协议的编程模型

版权声明:cxyo.cn https://blog.csdn.net/weixin_44075537/article/details/85002184

默写:
1.画图题
画出所学IO流类之间的关系。

2.编程题
使用实现继承的方式启动一个线程,在该线程中每隔一秒打印一次当前系统时间,主线程等待5秒之后停止子线程。

今天内容:
(1)网络编程的常识
(2)基于tcp协议的编程模型
(3)tcp协议和udp协议的比较
(4)基于udp协议的编程模型

1.网络编程的常识(记住)
目前主流的网络通讯软件有:QQ、微信、飞信、阿里旺旺、…

1.1 七层网络协议模型
为了数据安全可靠地传递到对方,ISO(国际标准委员会组织)将数据的传递从逻辑上划分为以下七层:
应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
当发送数据时需要按照上述七层协议一层层进行加包再发送出去。
当接收数据时需要按照上述七层协议相反的次序一层层进行拆分再显示出来。

1.2 常用的协议
http协议 - 超文本传输协议,浏览网页的功能需要使用该协议。
ftp协议 - 文件传输控制,当上传和下载文件时需要使用该协议。
tcp协议 - 传输控制协议,当进行网络通信时需要使用该协议。
udp协议 - 用户数据报协议,当进行网络通信时需要使用该协议。
ip协议 - 互联网协议,是上述协议的底层协议。

协议 - 本质上就是一种规则/约定,规定了通信双方统一的语言规则。

1.3 IP地址(重点)
如:
192.168.1.1 - 是绝大多数路由器的登录地址。

IP地址就是互联网中的唯一标识,本质上是由32位二进制组成的整数,叫做ipv4,也有128位二进制组成的整数,叫做ipv6,目前主流使用的是ipv4。
日常生活中采用点分十进制表示法来进行IP地址的描述,也就是将每个字节的二进制转换为一个十进制整数,不同的十进制整数之间采用.分隔。

如:
0x01020304 => 1.2.3.4

查看IP地址的方式:
在windows系统的dos窗口中使用命令 ipconfig 即可查看IP地址。
在linux系统的终端窗口中使用命令 ifconfig 即可查看IP地址。

1.4 端口号(重点)
IP地址 - 可以定位到具体某一台设备中。
端口号 - 可以定位到设备中的具体某一个进程。

端口号本质上就是由16位二进制组成的整数,范围是:0 ~ 65535,其中0 ~ 1024之间的端口号通常被系统占用,因此编程时从1025开始使用。
网络编程中需要提供:IP地址 + 端口号。

2.基于TCP协议的编程模型(重点)
2.1 基本概念
C/S架构 - Client(客户端)/Server(服务器).
B/S架构 - Browser(浏览器)/Server(服务器).
Socket - 本意为“插座”,在网络编程中主要指用于通信的载体/通信点。

2.2 编程模型
服务器:
(1)创建ServerSocket对象,并提供端口号。
(2)等待客户端的连接请求,使用accept()方法。
(3)得到Socket对象与客户端使用输入输出流进行通信。
(4)关闭Socket并释放有关的资源。

客户端:
(1)创建Socket对象,并提供服务器的IP地址和端口号。
(2)使用输入输出流进行通信。
(3)关闭Socket并释放有关的资源。

2.3 相关类和方法的解析
(1)ServerSocket类
java.net.ServerSocket类用于准备服务器端的套接字,也就是插座。
ServerSocket(int port) - 用于创建绑定到参数指定端口的套接字。
Socket accept() - 用于监听并接收到此套接字的连接请求。
void close() - 用于关闭套接字。

(2)Socket类
java.net.Socket类用于实现客户端套接字,是两台设备之间通信的端点。
Socket(String host, int port) - 用于创建套接字并连接到指定主机的指定端口上
InputStream getInputStream() - 用于返回套接字的输入流。
OutputStream getOutputStream() - 用于返回套接字的输出流。
void close() - 用于关闭套接字。

练习:
(1)要求实现服务器向客户端发送字符串内容"I received!".
(2)要求实现客户端发送的内容由用户手动输入,使用BufferedReader实现。
(3)要求实现客户端和服务器不断地通信,直到客户端发来"bye"时结束。
(4)要求服务器可以同时和多个客户端通信,采用多线程技术。

3.tcp协议和udp协议的比较(笔试题)
3.1 tcp协议
tcp协议 - 传输控制协议,是一种面向连接的协议,类似于打电话。
- 建立连接 => 进行通信 => 断开连接
- 在通信的整个过程中全程保持连接。
- 保证了数据传输的可靠性和有序性。
- 是一种全双工的字节流通信方式。
- 服务器压力比较大,资源消耗比较多,发送数据的效率相对比较低。

3.2 udp协议
udp协议 - 用户数据报协议,是一种非面向连接的协议,类似于写信。
- 在通信的整个过程中不保持全程连接。
- 不保证数据传输的可靠性和有序性。
- 是一种全双工的数据报通信方式。
- 服务器压力比较小,资源消耗比较少,发送数据的效率相对比较高。

4.基于udp协议的编程模型(重点)
4.1 编程模型
主机A(接收方):
(1)创建DatagramSocket类型的对象,并准备端口号。
(2)创建DatagramPacket类型的对象,并准备缓冲区。
(3)接收数据内容,调用receive()方法。
(4)关闭Socket并释放有关的资源。

主机B(发送方)
(1)创建DatagramSocket类型的对象。
(2)创建DatagramPacket类型的对象,并准备数据和收件人信息。
(3)发送数据内容,调用send()方法。
(4)关闭Socket并释放有关的资源。

4.2 相关类和方法的解析
(1)DatagramSocket类
java.net.DatagramSocket类用于描述发送和接收数据报的套接字,相当于码头。
DatagramSocket() - 创建对象并绑定到任何可用的端口号上。
DatagramSocket(int port) - 创建对象并绑定到参数指定的端口上。
void receive(DatagramPacket p) - 用于接收数据报存放到参数指定的对象中。
void send(DatagramPacket p) - 用于将参数指定的对象发送出去。
void close()

(2)DatagramPacket类
java.net.DatagramPacket类用于描述数据报信息的包裹,相当于集装箱。
DatagramPacket(byte[] buf, int length)
- 构造对象,用于接收长度为length的数据到buf数组中保存起来。
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
- 构造对象,用于将长度为length的数据发送到address主机上的port端口。
InetAddress getAddress() - 用于获取发送方/接收方的IP地址信息。
int getPort() - 用于获取发送方/接收方的端口号信息。
int getLength() - 用于获取发送/接收的数据长度。

(3)InetAddress类
java.net.InetAddress类用于描述IP地址等信息。
static InetAddress getLocalHost() - 用于返回本地主机的通信地址。
static InetAddress getByName(String host)
- 用于根据参数指定的主机名来获取该主机的通信地址信息。

视频
javaseday21-网络编程的基本常识-01
https://v.qq.com/txp/iframe/player.html?vid=y0800nxzjga
javaseday21-基于tcp协议的编程模型-02
https://v.qq.com/txp/iframe/player.html?vid=q0800yp2aqs
javaseday21-tcp协议编程模型的使用-03
https://v.qq.com/txp/iframe/player.html?vid=u0801mpu6hh
javaseday21-tcp协议编程模型的一对多实现-04
https://v.qq.com/txp/iframe/player.html?vid=j0801dnv0hx
javaseday21-udp协议的编程模型和使用-05
https://v.qq.com/txp/iframe/player.html?vid=p0800hbr4gx

代码
https://pan.baidu.com/s/1o-Ouj9G55oRUFV_0mj5yng

猜你喜欢

转载自blog.csdn.net/weixin_44075537/article/details/85002184