python 笔记 01—Web网络编程_UDP、TCP


TCP/UDP协议:

在TCP/IP网络体系结构中,TCP(传输控制协议,Transport Control Protocol、UDP(用户数据报协议,User Data Protocol)是传输层最重要的两种协议,为上层用户提供级别的通信可靠性。
用户数据报协议(UDP):UDP(用户数据报协议)是一个简单的面向数据报的传输层协议。提供的是非面向连接的、不可靠的数据流传输。UDP不提供可靠性,也不提供报文到达确认、排序以及流量控制等功能。它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。因此报文可能会丢失、重复以及乱序等。但由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
传输控制协议(TCP):TCP(传输控制协议)定义了两台计算机之间进行可靠的传输而交换的数据和确认信息的格式,以及计算机为了确保数据的正确到达而采取的措施。协议规定了TCP软件怎样识别给定计算机上的多个目的进程如何对分组重复这类差错进行恢复。协议还规定了两台计算机如何初始化一个TCP数据流传输以及如何结束这一传输。TCP最大的特点就是提供的是面向连接、可靠的字节流服务。

TCP、UDP两者区别:

1、TCP是面向连接的(在客户端和服务器之间传输数据之前要先建立连接),UDP是无连接的(发送数据之前不需要先建立连接)
2、TCP提供可靠的服务(通过TCP传输的数据。无差错,不丢失,不重复,且按序到达);UDP提供面向事务的简单的不可靠的传输。
3、UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性比较高的通讯或广播通信。随着网速的提高,UDP使用越来越多。
4、每一条TCP连接只能是点到点的,UDP支持一对一,一对多和多对多的交互通信。
5、TCP对系统资源要求比较多,UDP对系统资源要求比较少
6、UDP程序结构更加简单
7、TCP是流模式,UDP是数据报模式

python编码实现基本通信功能:

UDP实现简单通信:

 1 import socket
 2 
 3 def main():
 4     # 创建套接字
 5     udp_sockect = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 6     # 绑定端口
 7     udp_sockect.bind(("", 7799))
 8     while True:
 9         # 发送
10         print("1:发送 2:接收 3:退出")
11         input_data = input("选择功能:")
12         if input_data == "1":
13             send_data = input("请输入要发送的内容:")
14             udp_sockect.sendto(send_data.encode("gbk"), ("192.168.31.219", 8080))
15         elif input_data == "2":
16             # 接收
17             recv_data = udp_sockect.recvfrom(1024)
18             print("{}.{}".format(str(recv_data[1]), recv_data[0].decode("gbk")))
19         elif input_data == "3":
20             break
21         else:
22             print("输入错误请重输:")
23         # 关闭
24         udp_sockect.close()
25 if __name__ == "__main__":
26     main()

TCP-客户端简单发送:

 1 import socket
 2 
 3 def main():
 4     # 创建套接字
 5     tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 6     # 链接服务器
 7     tcp_socket.connect(("192.168.31.219", 7789))
 8     # 发送数据
 9     input_data = input("请输入要发送的数据:")
10     tcp_socket.send(input_data.encode("gbk"))
11     # 关闭
12     tcp_socket.close()
13 if __name__ == "__main__":
14     main()

TCP-服务端轮询处理不同客户端请求、同客户端不同请求:

 1 import socket
 2 
 3 def main():
 4     # 创建套接字
 5     tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 6     # 绑定信息
 7     tcp_server_socket.bind(("", 7789))
 8     # 监听请求
 9     tcp_server_socket.listen(128)
10     # 分发请求体给新套接字
11     # 循环接收来自不同客户端的请求
12     while True:
13         print("等待请求...")
14         new_client_socket, client_addr = tcp_server_socket.accept()
15         print("收到了{}发来的请求!".format(client_addr))
16         # 循环接收来自同一客户端的不同请求
17         while True:
18             # 接收请求
19             recv_data = new_client_socket.recv(1024)
20             print("客户端发送的请求是:{}".format(recv_data.decode("gbk")))
21             # recv解阻塞的两种情况:
22             # 1.客户端发送过来的数据
23             # 2.客户端调用close导致传回none值
24             if recv_data:
25                 new_client_socket.send("已经收到你的清求!".encode("gbk"))
26             else:
27                 break
28         new_client_socket.close()
29         print("已经服务完毕...")
30     tcp_server_socket.close()
31 if __name__ == "__main__":
32     main()