【Python学习笔记】UDP编程与多线程入门(简易聊天工具编程)

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允许应用程序并发地运行多个执行路径


      一)多线程:
  1)什么是多线程:多线程就是在一个进程中创建多个线程,每个线程完成一个任务
  2)优点:多线程技术使程序的响应速度更快,提高资源利用率,程序设计更简单
          3)执行特性: 1.随机性(异步执行),谁抢到cpu谁执行
      2.宏观上同时执行,微观上同一时刻只能执行一个线程
  4)Python创建多线程:
     1.使用threading模块

     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())








你可能感兴趣的:(Python基础,计算机网络编程,多线程)