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)
udp_client
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_sever

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

  

 

posted @ 2019-12-13 17:24  槑槑DE  阅读(160)  评论(0编辑  收藏  举报