Day20
----------------------------------------------------------------------------------
今天内容:
(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地址是互联网中的唯一地址标识,通过IP地址可以定位到具体某一台设备。
IP地址上本质上就是由32位二进制组成的整数,叫做IPv4,当然也有128位二进制组成的整数,叫做IPv6,目前主流的配置还是IPv4.
日常生活中采用点分十进制表示法进行IP地址的描述,也就是将每个字节的二进制转换为一个十进制整数,不同的整数之间采用小数点分隔。
如:
0x01020304 => 1.2.3.4
查看IP地址的方式:
windows系统 - 在dos窗口中使用命令ipconfig 或 ipconfig/all即可
linux系统 - 在终端窗口中使用命令ifconfig 或 /sbin/ifconfig即可
1.4 端口号(重点)
IP地址 - 可以定位到具体某台设备。
端口号 - 可以定位到具体某个进程。
网络编程需要提供:IP地址 + 端口号。
端口号本质上就是由16位二进制组成的整数,范围是:0 ~ 65535,其中0 ~ 1024之间的端口号通常被系统占用,因此编程从1025开始使用。
2.基于tcp协议的编程模型(重中之重)
2.1 编程模型
服务器:
(1)创建ServerSocket类型的对象并提供端口号;
(2)等待客户端的连接请求,调用accept()方法;
(3)使用输入输出流进行通信;
(4)关闭Socket并释放有关的资源;
客户端:
(1)创建Socket类型的对象,并提供服务器的IP地址和端口号;
(2)使用输入输出流进行通信;
(3)关闭Socket并释放有关的资源;
2.2 相关类和方法的解析
(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() - 关闭套接字。
练习:
a.要求服务器接收到客户端发送的"hello"后向客户端回发消息"I received!";
b.要求客户端发送的内容由用户从键盘输入;
c.要求服务器和客户端可以不断地通信,直到客户端发送"bye"聊天结束;
d.要求服务器可以不断地响应客户端的连接请求,采用多线程技术。
3.tcp协议和udp协议的比较(笔试题)
3.1 tcp协议
- 传输控制协议,是一种面向连接的协议,类似于打电话。
- 建立连接 => 进行通信 => 断开连接
- 在通信的整个过程中全程保持连接
- 保证了数据传输的可靠性和有序性
- 是一种全双工的字节流通信方式
- 服务器压力比较大,资源消耗比较多,相对来说发送数据的效率比较低
3.2 udp协议
- 用户数据报协议,是一种非面向连接的协议,类似于写信。
- 在通信的整个过程中不保持连接
- 不保证数据传输的可靠性和有序性
- 是一种全双工的数据报通信方式
- 服务器压力比较小,资源消耗比较少,相对来说发送数据的效率比较高
4.基于udp协议的编程模型(重点)
4.1 编程模型
接收方:
(1)创建DatagramSocket类型的对象并提供端口号;
(2)创建DatagramPacket类型的对象用于接收数据内容;
(3)接收数据内容,调用receive()方法;
(4)关闭Socket并释放有关的资源;
发送方:
(1)创建DatagramSocket类型的对象;
(2)创建DatagramPacket类型的对象并提供接收方的IP地址和端口号;
(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) - 用于接收数据包并记录到参数变量中;
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
- 用于将参数指定的数据发送到参数指定的位置
InetAddress getAddress() - 用于获取发送方或接收方的通信地址信息。
int getPort() - 用于获取发送方或接收方的端口信息。
int getLength() - 用于获取发送或接收数据的长度。
(3)InetAddress类
java.net.InetAddress类用于描述互联网协议地址。
static InetAddress getLocalHost() - 用于获取本地主机的通信地址信息。
static InetAddress getByName(String host) - 根据参数指定的主机名来获取通信地址。
String getHostName() - 用于获取通信地址中的主机名信息。
String getHostAddress() - 用于获取通信地址中的IP地址信息。
作业:
1.重点掌握基于tcp协议的编程模型;
2.记录基于udp协议的相关内容;