网络通信(二)

UDP服务器接收数据和发送数据

UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包。但是,能不能到达就不知道了。虽然用UDP传输数据不可靠,但它的优点是和TCP比,速度快,对于不要求可靠到达的数据,就可以使用UDP协议。

创建Socket时,SOCK_DGRAM指定了这个Socket的类型是UDP。绑定端口和TCP一样,但是不需要调用listen()方法,而是直接接收来自任何客户端的数据。recvfrom()方法返回数据和客户端的地址与端口,这样,服务器收到数据后,直接调用sendto()就可以把数据用UDP发给客户端。

UDP编程的实现

【示例】UDP接收数据

python 复制代码
#coding=utf-8
from socket import *
s = socket(AF_INET, SOCK_DGRAM) #创建套接字
#绑定接收信息端口
s.bind(('127.0.0.1', 8888)) #绑定一个端口,ip地址和端⼝号
print("等待接收数据!")
redata = s.recvfrom(1024) #1024表示本次接收的最⼤字节数
print(redata)
print(f'收到远程信息:{redata[0].decode("gbk")}, from {redata[1]}')
s.close()

【示例】UDP发送数据

python 复制代码
from socket import *
s = socket(AF_INET, SOCK_DGRAM) #创建套接字
addr = ('127.0.0.1', 8888) #准备接收方地址
data = input("请输入:")
#发送数据时,python3需要将字符串转成byte
s.sendto(data.encode('gbk'),addr) #默认的网络助手使用的编码是gbk
s.close()

UDP持续通信

【示例】UDP接收数据

python 复制代码
#coding=utf-8
from socket import *
​
s = socket(AF_INET,SOCK_DGRAM) #创建UDP类型的套接字
s.bind(("127.0.0.1",8888)) #绑定端口,ip可以不写
print("等待接收数据!")
while True:
  recv_data = s.recvfrom(1024)  #1024表示本次接收的最大字节数
  recv_content = recv_data[0].decode('gbk')
  print(f"收到远程信息:{recv_content},from {recv_data[1]}")
  if recv_content == "88":
    print("结束聊天!")
    break
​
s.close()

【示例】UDP发送数据

python 复制代码
#coding=utf-8
from socket import *
​
s = socket(AF_INET,SOCK_DGRAM) #创建UDP类型的套接字
addr = ("127.0.0.1",8888)
​
while True:
  data = input("请输入:")
  s.sendto(data.encode("gbk"),addr)
  if data == "88":
    print("结束聊天!")
    break
​
s.close()

UDP多线程结合自由通信

结合多线程实现UDP双向自由通信

UDP 不同于 TCP,不存在请求连接和受理过程,因此在某种意义上无法明确区分服务器端和客户端,只是因为其提供服务而称为服务器端。

如下服务端、客户端代码几乎一模一样,注意接收和发送端口对应,即可。

【示例】UDP实现多线程服务端

python 复制代码
#coding=utf-8
from socket import *
from threading import Thread
udp_socket=socket(AF_INET,SOCK_DGRAM)
#绑定接收信息端口
udp_socket.bind(('127.0.0.1',8989))
​
#不停接收
def recv_data():
  while True:
    redata = udp_socket.recvfrom(1024)
    print(f'收到信息:{redata[0].decode("gbk")}, from {redata[1]}')
​
#不停发送
def send_data():
  while True:
    data=input('输入信息:')
    addr=('127.0.0.1',8080)
    udp_socket.sendto(data.encode('gbk'),addr)
​
if __name__=='__main__':
  # 创建两个线程
  t1=Thread(target=send_data)
  t2=Thread(target=recv_data)
  t2.start()
  t1.start()
  t1.join()
  t2.join()

【示例】UDP实现多线程客户端

python 复制代码
#coding=utf-8
from socket import *
from threading import Thread
udp_socket=socket(AF_INET,SOCK_DGRAM)
#绑定接收信息端口
udp_socket.bind(('127.0.0.1',8080))
​
#不停接收
def recv_data():
  while True:
    redata = udp_socket.recvfrom(1024)
    print(f'收到信息:{redata[0].decode("gbk")}, from {redata[1]}')
​
#不停发送
def send_data():
  while True:
    data=input('输入信息:')
    addr=('127.0.0.1',8989)
    udp_socket.sendto(data.encode('gbk'),addr)
​
if __name__=='__main__':
  # 创建两个线程
  t1=Thread(target=send_data)
  t2=Thread(target=recv_data)
  t2.start()
  t1.start()
  t1.join()
  t2.join()
相关推荐
你驴我11 分钟前
WhatsApp 多账号下消息已读回执的实时聚合与推送实践
后端·python
AC赳赳老秦2 小时前
OpenClaw 采集任务日志审计:全程记录采集行为,满足合规溯源与企业审计要求
java·大数据·python·数据挖掘·数据分析·php·openclaw
huangdong_3 小时前
电商图片下载工具横向对比深度评测:固乔、FATKUN、图快、当图、淘蛙、存图宝七款工具全面解析
python
满怀冰雪3 小时前
04-Paddle Tensor 基础:形状、数据类型、广播与索引
python·深度学习·神经网络·paddle
cui_ruicheng3 小时前
Python从入门到实战(十五):文件操作与目录管理
开发语言·python
xcLeigh3 小时前
Doubao-Seed-Evolving大模型接入教程|搭建全品类提示词+AI工具导航网页
前端·人工智能·python·ai·html·ai开发·豆包
不如语冰3 小时前
AI大模型入门-模块导入import
数据结构·人工智能·pytorch·python
投票竞赛3 小时前
书法、绘画作品投票评选,图片投票小程序作品集排版
python·小程序
梦远青城4 小时前
Docker 部署python的paddle进行OCR文字识别身份证
python·docker·ocr·paddle·身份证识别
编码者卢布4 小时前
【Azure APIM】APIM的诊断日志与Application Insights的日志是否可以串联为一个端到端的日志链路呢?
python·flask·azure