Python3基础-UDP_socket
一、基于UDP的套接字
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)
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()
浙公网安备 33010602011771号