UDP协议: UDP :(User Datagram Protocol):用户数据报协议 特点:面向无连接,效率高速度快,但是可靠性差 使用:适用于对效率要求相对较高而对准确性要求相对较低的场合, 例如视频在线点播、网络语音通话等等。UDP编程:
工具:与TCP相同,运用socket模块 格式: import socket s = socket.socket(type=socket.SOCK_DGRAM) s.sendto("发送的内容",("目标IP","端口")) # 发送 如果是接收方,则必须先绑定(bind()方法)本socket对象的地址与端口。 data,addr = s.recvfrom(1024) 实例:
1.发送者:
import socket
s=socket.socket(type=socket.SOKE_DGRM)#实际socket.SOKE_DGRM=2,但是为了避免出现失误不写二
data = "hello".encode()
s.sendto(data,("localhost",8888)) #面向无连接,直接发送到接收地址,不管接收方在不在线,都可以发送过去,不会报错
print("发送成功!")
s.close()
2.接收者:
import socket
s = socket.socket(type=socket.SOCK_DGRAM)
s.bind(("localhost",8888)) # 接收端需要绑定公开自己的接收地址与端口
data,addr = s.recvfrom(1024) # 进行解包,分别是发送过来的数据与发送者的地址
print("接收到的数据是:",data.decode())
s.close()
多线程入门:
什么是进程:每个独立运行着的程序称为一个进程.
什么是线程:线程是一个进程内部的一条执行路径(path),Python允许应用程序并发地运行多个执行路径
一)多线程:2.将类继承于threading.Thread,在__init__方法中调用threading.Thread类的__init__方法,并重 写run方法。
5) 实例:白起攻赵"""
白起攻打邯郸的同时还可以派出一队人马去去运输粮草
"""
from threading import Thread
import time
class AttackThread(Thread):
def __init__(self):
Thread.__init__(self)
def run(self):
print("白起:粮草官去给我运粮去!")
print("粮草官:领命!")
print("准备出发运粮...")
time.sleep(5) #运粮休眠过程中不占用cpu
print("粮草官:报告将军粮草已到!")
attack = AttackThread()# 实例化线程对象
print("白起:准备攻城")
attack.start() #开启运粮子线程
time.sleep(4) # 攻城需要3s
print("占领邯郸!")
二)多线程与UDP配合
实例:简易聊天系统
发送线程:使客户端拥有发送信息的功能,与接收功能不冲突
from threading import Thread
class SenderThread(Thread):
def __init__(self,s,address,port):
Thread.__init__(self)
self.s = s
self.address = address # 你要发送到的地址
self.port = port # 你要发送到的接口
def run(self):
while True:
data = input("我说:")
self.s.sendto(data.encode(),(self.address,self.port))
接收线程:
from threading import Thread
class ReciverThread(Thread):
def __init__(self,s):
Thread.__init__(self)
self.s = s
def run(self):
data,addr = self.s.recvfrom(1024) #解包
print(addr,"说",data.decode())
客户端A
from 发送线程 import SenderThread
from 接收 import ReciverThread
import socket
s = socket.socket(type = socket.SOCK_DGRAM)
s.bind(("localhost",4800)) #为了接收而绑定地址与端口
sender = SenderThread(s,"localhost",6300) #发送只需要知道接收者的地址与端口
sender.start()
reciver = ReciverThread(s)
reciver.start()
客户端B
from 发送线程 import SenderThread
from 接收 import ReciverThread
import socket
s = socket.socket(type = socket.SOCK_DGRAM)
s.bind(("localhost",6300))
sender = SenderThread(s,"localhost",4800)
sender.start()
reciver = ReciverThread(s)
reciver.start()
三)TCP与多线程配合
实例:echo多线程版本
多线程服务器功能
from threading import Thread
import timeclass ServerThread(Thread): def __init__(self,s_client): Thread.__init__(self) self.s_client = s_client def run(self): print(self.name + "准备回应了...") data = self.s_client.recv(1024) time.sleep(10) self.s_client.sendall(data)
服务器:
import socket
from server_thread import ServerThread
s = socket.socket()
s.bind(("localhost",8888))
s.listen(5)
while True:
print("等待连接...")
s_client,addr = s.accept() #等待客户端连接,连接之前一只阻塞
ServerThread(s_client).start() # 针对每一个连接的客户端开启一个新的线程
客户端:可以多个向服务器发送请求
import socket
s = socket.socket()
s.connect(("localhost",8888))
s.sendall("你好".encode())
data = s.recv(1024)
print("接收到的回应信息",data.decode())