- 一、UDP编程
- 1.特点
- 1、UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。
- 2、UDP传输数据时有大小限制,每个被传输的数据报必须限定在64KB之内。
- 3、UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。
- 2.应用场景:
- UDP是面向消息的协议,通信时不需要建立连接,数据的传输自然是不可靠的,UDP一般用于多点通信和实时的数据业务,
- 例如:语音广播、视频、QQ、TFTP(简单文件传送)、SNMP(简单网络管理协议)、RIP(路由信息协议,如报告股票市场,航空信息)、
- DNS(域名解释)、注重速度流畅、UDP操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中client/server应用程序。
- 例如视频会议系统,并不要求音频视频数据绝对的正确,只要保证连贯性就可以了,这种情况下显然使用UDP会更合理一些。
- 3.套接字
- 1.简介
- socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:
- 它能实现不同电脑间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的;例如我们每天浏览网页、QQ 聊天、收发 email 等等
- 2.from socket import *
- udp_socket=socket(AF_INET,SOCK_DGRAM) 创建一个可以在不同电脑之间通信的udp套接字
- tcp_socket=socket(AF_UNIX,SOCK_STREAM) 创建一个可以在同一台电脑之间通信的tcp套接字
- 3.实现聊天(多线程发送接收)
- from socket import *
- from threading import Thread
- send_socket=socket(AF_INET,SOCK_DGRAM) #创建发送套接字对象
- send_socket.bind(("",9999)) #绑定端口 元组形式("ip",端口) ip可以用""代替,如果写错自己的ip报错
- def send_msg():
- while True:
- msg=input(">>") #输入发送内容
- send_socket.sendto(msg.encode("utf-8"),("127.0.0.1",9000)) #127.0.0.1 为接受方ip,9999为端口号必须和接收方端口一致,发送的消息需编码
- if msg=="bye":
- break
- while True:
- def recf_msg():
- while True:
- content=send_socket.recvfrom(1024) #接收消息 1024为接收消息的容器大小(缓冲大小)
- #content为一个元组 content[0] 为接收到的消息,content[1] 为元组 (发送方ip,发送方端口号)
- msg=content[0].decode("utf-8") #接送到的消息需解码
- print("<<"+msg)
- if msg=="bye":
- break
- while True:
- t1=Thread(target=send_msg)
- t2=Thread(target=recf_msg)
- t1.start()
- t2.start()
- t1.join()
- t2.join()
- #接收方与发送方代码基本一致 1.接收方绑定端口为9000与发送方发送消息的端口一致 2,接收方发送消息端口为9999与发送方绑定端口一致
- 1.简介
- 4:udp广播
- 当发出一个目的地址为广播地址时,它将被分发给该网段上的所有计算机。127.0.0.1为本机回环地址 广播地址为网段的最后一位地址
- sock对象.setsockopt(SOL_SOCKET, SO_BROADCAST, 1) # 发送消息声明广播类型的socket
- 5.pack和unpack封装数据,和解包数据
- from struct import pack,unpack
- msg=pack("!H8sb",1,"test.jpg".encode(),2) "!"网络传输数据,H整型代替1占两个字节,8s代替字符串test.jpg(字符串需编码),b代替0占1个字节
- tuple=unpack("!H8sb",msg) 解包要与封装格式一样,解包返回一个包含消息的数据(1,test.jpg,2)
- 5.udp绑定问题
- 一般情况下,服务器端,需要绑定端口,目的是为了让其他的客户端能够正确发送到此进程。
- 客户端,一般不需要绑定,而是让操作系统随机分配,这样就不会因为需要绑定的端口被占用而导致程序无法运行的情况。
- 6.总结
- 1.udp协议是不可靠传输协议,不能保证到达另一端以及到达顺序。
- 2.udp在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
- 3.udp是TCP/IP协议族中的一种协议能够完成不同机器上的程序间的数据通信。
- 4.udp服务器、客户端
- udp的服务器和客户端的区分:往往是通过请求服务和提供服务来进行区分。
- 请求服务的一方称为:客户端
- 提供服务的一方称为:服务器
- 1.特点
- 二、TCP编程
- 1.特点
- 1.TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,它完成传输层所指定的功能,用户数据报协议(UDP)是同一层内另一个重要的传输协议。
- 在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接;
- 2.它的可靠性体现在:3次握手建立连接,滑动窗口机制,一定的拥塞避免算法,流量控制,以及一定的超时重传机制。
- 3.TCP提供可靠,稳定的传输(三次握手,数据确认机制,重传机制,拥塞控制),由于这些导致TCP传输效率低,速度慢(各种机制+每次连接都会消耗CPU,内存等资源)
- 2.TCP和UDP区别
- 1.TCP面向连接---UDP面向无连接
- 2.TCP首部20字节---UDP首部8字节
- 3.TCP只能点对点通信---UDP可以实现一对一,一对多,多对一,多对多通信
- 4.TCP使用字节流传输---UDP使用报文传输
- 5.TCP提供可靠,稳定的传输(三次握手,数据确认机制,重传机制,拥塞控制),由于这些导致TCP传输效率低,速度慢(各种机制+每次连接都会消耗CPU,内存等资源)---UDP提供不可靠,不稳定的传输(网络不好容易丢包),但传输效率高,速度快
- 3.实现聊天(服务端和客户端)
- #服务端
- from socket import *
- from threading import currentThread,Thread
- sock=socket(AF_INET,SOCK_STREAM) #创建socket对象 SOCK_STREAM 为TCP,AF_INET 为不同电脑通信,
- sock.setsocket(SOL_SOCKET,SO_REUSEADDR,1) # 设置程序关闭,端口释放快一点(防止出现程序重新启动,出现端口被占用)
- sock.bind(("",9900)) #绑定端口
- sock.listen(3) # 设置监听模式等待客户端的链接
- def recf_msg(): #接收消息线程
- while True:
- msg=recf_sock.recv(1024) #设置接收容器缓冲大小,使用新的socket对象接收消息
- print(">>"+msg.decode("utf-8")) #消息解码
- while True:
- def send_msg(): #发送消息线程
- while True:
- msg=currentThread().name+":"+input(">>")
- recf_sock.send(msg.edcode("utf-8")) #使用新的socket对象发送消息编码
- while True:
- while True:
- recf_sock,send_adress=sock.accept() #等待链接,当有链接的时候解除阻塞,并且返回新的socket对象和对应的地址
- Thread(target=recf_msg).start()
- Thread(target=send_msg,name="服务器").start()
- #客户端
- from socket import *
- from threading import currentThread,Thread
- sock_send=socket(AF_INET,SOCK_STREAM)
- sock.content(("127.0.0.1"),9900) #tcp三次握手链接服务器,127.0.0.1为服务器ip(这儿使用本机测试),链接端口与服务器一样
- def send_msg(): #发送消息线程
- while True:
- msg=currentThread().name+":"+input(">>")
- sock_send.send(msg.edcode("utf-8")) #消息编码
- while True:
- def recf_msg(): #接收消息线程
- while True:
- msg=sock_send.recv(1024) #设置接收容器缓冲大小,接收消息
- print(">>"+msg.decode("utf-8")) #消息解码
- while True:
- t1=Thread(target=recf_msg)
- t2=Thread(target=send_msg,name="客户端")
- t1.start()
- t2.start()
- t1.join()
- t2.join()
- 1.特点
python TCP和UDP编程
最新推荐文章于 2024-04-01 17:20:15 发布