作业4 UDP编程基础
1.实现一个基本的UDP通信
- 实现课本代码清单2-1
(1)源代码:
(2)运行结果:
- 掌握python中外部参数的输入过程
argparse库,是一个用来解析命令行参数的python库,通过该模块可以使用户便捷地在命令行运行程序的同时传入简单的参数。
(1)服务器
过程:创建套接字->绑定端口->循环(接收数据,处理数据,返回数据)
创建socket时,socket库提供socket类,从而创建socket对象,AF_INET是address family地址簇(基于TCP/IP协议簇),SOCK_DGRAM指定了这个socket的类型是UDP。
绑定端口时,和TCP一样,不需要调用listen()方法,而是直接接收来自任何客户端的数据,127.0.0.1:本机特定端口号。
循环中,recvfrom()方法返回数据和客户端的地址和端口,这样,服务器收到数据后,直接调用sendto()就可以把数据用UDP发给客户端,且MAX_BYTES会对接受来的数据进行大小的设定,不能超过这个大小。服务器会先将接收到的数据进行ascii解码,然后对数据处理,最后以二进制形式编码,将文本转化为相应的二进制数据返回。
(2)客户端
过程:创建套接字->发送数据->接收数据
不需要调用connect(),UDP是基于无连接的,客户端和服务器之间没有真正的连接,只是形式化的,直接通过sendto()给服务器发送数据,从服务器接收到的数据调用recv()方法。但接受的数据是不可靠的,客户端认为只要是服务器发过来的,都会接受,未进行有效检查。
- 更换不同的端口参数运行程序
通过可选参数-p更换不同的端口参数。
2.实现基于UDP的聊天程序
- 参照老师的代码实现聊天程序
(1)源代码:
(2)运行结果:
- 发送中文数据
只要修改编码的格式即可,将ascii改成中文字符编码utf-8或者GBK、BIG5都可。
(1)源代码修改如下:
(2)运行结果:
- 局域网传输问题
要在原来的代码中引入其他两个参数,分别代表自己和别人的IP(myip,otherip),然后在程序入口下面,调用add_argument()方法添加参数-myip,-otherip,并以字符串的形式输入;再使用parse_args()解析添加的参数,检查命令行,把每个参数转换成适当的类型,最后可以实现两个不同主机上数据的传输。
(1)源代码:
(2)运行结果:
- 更加人性化的聊天模式
要实现一次性发多条信息的功能,便于大众使用,使用多线程,即第二个任务不必等第一个任务结束后才进行,且进程间的数据可以共享。使用多线程,要导入threading库,其提供函数:threading.Thread(target=function,args=(),kwargs{})。
调用 threading.Thread 之后,会创建一个新的线程,参数 target 指定线程将要运行的函数,args 和 kwargs 则指定函数的参数来执行function 函数。
(1)源代码:
(2)运行结果: