一.udp网络程序-发送数据
socket函数
mySocket = socket(family, type)
函数socket()的参数family用于设置网络通信的域,函数socket()根据这个参数选择通信协议的族。通信协议族在文件sys/socket.h中定义。
函数socket()的参数type用于设置套接字通信的类型,主要有SOCKET_STREAM(流式套接字)、SOCK——DGRAM(数据包套接字)等。
并不是所有的协议族都实现了这些协议类型,例如,AF_INET协议族就没有实现SOCK_SEQPACKET协议类型。
创建一个udp客户端程序的流程是简单,具体步骤如下:
1.创建客户端套接字
2.发送/接收数据
3.关闭套接字
代码如下:
from socket import *
#1.创建套接字
udpSocket = socket(AF_INET, SOCK_DGRAM)
#2.准备接收方的地址
sendAddr = ('192.168.11.74', 7788)
#3.从键盘获取数据
sendData = input("请输入要发送的数据:")
#4.发送数据到指定的电脑上
udpSocket.sendto(sendData.encode('gbk'), sendAddr)
#5.关闭套接字
udpSocket.close()
通过网络调试助手来测试:
二.udp网络程序-发送、接收数据
没有绑定端口的情况:
绑定端口的情况下:
三.udp网络程序-端口问题
会变的端口号
重新运行多次脚本,然后在“网络调试助手”中,看到的现象如下:
可以看到端口号多次改变。
说明:
·每重新运行一次网络程序,都会重新分配端口,不一样的原因在于,这个数字标识这个网络程序,当重新运行时,如果没有确定到底用哪个,系统默认会随机分配
·记住一点:这个网络程序在运行的过程中,这个就唯一标识这个程序,所以如果其他电脑上的网络程序如果想要向此程序发送数据,那么就需要向这个数字(即端口)标识的程序发送即可。
四.udp绑定信息
1.绑定信息
还记得在上一节课中,如果一个网络程序在每次运行的时候端口是随机变化的么?
一般情况下,在一天电脑上运行的网络程序有很多,而各自用的端口号很多情况下不知道,为了不与其他的网络程序占用同一个端口号,往往在编程中,udp的端口号一般不绑定
但是如果需要做成一个服务器端的程序的话,是需要绑定的,想想看这又是为什么呢?
如果报警电话每天都在变,想必世界就会乱了,所以一般服务性的程序,往往需要一个固定的端口号,这就是所谓的端口绑定
2.绑定示例
说明:
·一个udp网络程序,可以不绑定,此时操作系统会随机进行分配一个端口,如果重新运行次程序端口可能会发生变化
·一个udp网络程序,也可以绑定信息(ip地址,端口号),如果绑定成功,那么操作系统用这个端口号来进行区别收到的网络数据是否是此进程的
五.udp网络通信过程
六.udp应用:echo服务器
七 udp应用 聊天室
八 udp广播
1 现实中的广播
通过喇叭,收音机等,可以让一定范围内的群众接收到指定的信息。
2 网络编程中的广播
使用<broadcast>会自动找到广播所在的位置
九 udp 总结
1. udp是TCP/IP协议族中的一种协议能够完成不同机器上的程序间的数据通信
2. udp服务器、客户端
·udp的服务器和客户端的区分:往往是通过请求服务和提供服务来进行区分
·请求服务的一方称为:客户端
·提供服务的一方称为:服务器
3. udp绑定问题
·一般情况下,服务器端,需要绑定端口,目的是为了让其他的客户端能够正确发送到此进程
·客户端,一般不需要绑定,而是让操作系统随机分配,这样就不会因为需要绑定的端口被占用而导致程序无法运行的情况
十 udp综合作业 模拟QQ
要求:
·使用多线程完成一个全双工的QQ聊天程序
单工、半双工、全双工
单工数据传输只支持数据在一个方向上传输;
半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;
全双工数据通信允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力.
十一 wireshark 抓包工具的使用
1安装wireshark
通过安装包和教程将wireshark抓包软件安装好
2 使用 wireshark
点击start监听正在运行的程序
查看当前程序的具体信息