Python3基础-UDP_socket
一、基于UDP的套接字
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import socket ip_post =('127.0.0.1',8080) udp_ck = socket.socket(type=socket.SOCK_DGRAM) while True: msg= input("请输入账号信息>>>>:").strip() udp_ck.sendto(msg.encode('utf-8'),ip_post) back_msg,addr = udp_ck.recvfrom(1024) print(back_msg.decode('utf-8'),addr)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import socket ip_post = ('127.0.0.1',8080) udp_sk = socket.socket(type=socket.SOCK_DGRAM) #创建一个服务器得套接字 udp_sk.bind(ip_post) #绑定服务器套接字 while True: msg,addr = udp_sk.recvfrom(1024) print(msg) udp_sk.sendto(msg.upper(),addr) #对话(接收/发送) udp_sk.close() #关闭服务器套接字
udp是无链接的,启动服务之后可以直接接收消息,不需要提取建立链接
recv与recvfrom 的区别
tcp:send发消息,recv收消息
udp:sendto 发消息,recvfrom收消息
recv 从缓冲区读取为空,会堵塞
recvfrom 从缓冲区读取为空,就直接读取一个空
#
import socket
import time
ip_post = ('127.0.0.1',8080)
udp_sk = socket.socket(type=socket.SOCK_DGRAM) #创建一个服务器得套接字
udp_sk.bind(ip_post) #绑定服务器套接字
while True:
msg,addr = udp_sk.recvfrom(1024)
print(msg)
if not msg:
fmt = '%Y-%m-%d %X'
else:
fmt = msg.decode('utf-8')
backTime = time.strftime(fmt)
udp_sk.sendto(backTime.encode('utf-8'),addr) #对话(接收/发送)
udp_sk.close() #关闭服务器套接字
#客户端
import socket
ip_post =('127.0.0.1',8080)
buffer_size = 1024
udp_ck = socket.socket(type=socket.SOCK_DGRAM)
while True:
msg= input("upd_client请输入账号信息>>>>:").strip()
udp_ck.sendto(msg.encode('utf-8'),ip_post)
back_msg,addr = udp_ck.recvfrom(buffer_size)
print('ntp服务器的标准时间是:',back_msg.decode('utf-8'))
socket 基于udp的远程命令
#upd_socket_server端 import socket import subprocess back_log = 5 buffer_size =1024 ip_post = ('127.0.0.1',8898) udp_sk = socket.socket(type=socket.SOCK_DGRAM) #创建一个服务器得套接字 udp_sk.bind(ip_post) while True: data,addr = udp_sk.recvfrom(1024) data = data.decode('utf-8') print('服务端收到客户端发来的消息:', data) res = subprocess.Popen(data, shell=True, # 第一个参数:命令字符串 第二个参数指定由shell处理 stderr=subprocess.PIPE, # 将基本的输入、输出以及错误都放入管道 stdin=subprocess.PIPE, # 这些在管道里的信息都是字节形式,编码为utf-8 stdout=subprocess.PIPE ) err = res.stderr.read() # 定义一个err变量接收基本的错误信息 if err: # 如果错误信息不为空 cmd_res = err # 输出的结果为基本的错误信息 else: cmd_res = res.stdout.read() # 输出的结果为基本的输出信息 if not cmd_res: # 有些命令无返回结果,需要进行判断 cmd_res = '该命令没有返回结果'.encode('gbk') udp_sk.sendto(cmd_res,addr) # 像客户端发送执行结果 udp_sk.close() #关闭服务器套接字
#upd_socket_client端 import socket ip_post =('127.0.0.1',8898) udp_client = socket.socket(type=socket.SOCK_DGRAM) while True: cmd = input('请输入命令>>>').strip() if not cmd: continue if cmd == 'quit': break udp_client.sendto(cmd.encode('utf-8'),ip_post) back_msg,addr = udp_client.recvfrom(1024) print('命令执行的结果是', back_msg.decode('gbk')) upd_client.close()