zoukankan      html  css  js  c++  java
  • Python Day 27 网络编程 (socket udp)

    Python Day 27 网络编程 (socket udp)

    基于UDP协议的socket

      udp是无链接的,启动服务之后可以直接接受消息不需要提前建立链接.

    sk = socket.socket(type=socket.SOCK_DGRAM) #指定socket协议类型
    msg_r,addr = sk.recvfrom(1024) #接受一个消息
    sk.sendto(msg_s.encode('utf-8'),('127.0.0.1',8091)) #发给谁一个消息

    简单版:   

    #一次收发
    import socket
    sk = socket.socket(type=socket.SOCK_DGRAM)
    sk.bind(('127.0.0.1',8091))
    
    msg_r,addr = sk.recvfrom(1024) #接受一个消息
    print('Receive:',msg_r.decode('utf-8'))
    
    msg_s = 'hello,client'
    sk.sendto(msg_s.encode('utf-8'),addr) #发给谁一个消息
    print('Reply:',msg_s)
    
    sk.close()
    #一次收发 Server
    #一次收发
    import socket
    sk = socket.socket(type=socket.SOCK_DGRAM)
    
    msg_s = 'hello,server'
    sk.sendto(msg_s.encode('utf-8'),('127.0.0.1',8091)) #发给谁一个消息
    
    msg_r,addr = sk.recvfrom(1024) #接受一个消息
    print('Receive:',msg_r.decode('utf-8'))
    
    sk.close()
    #一次收发 Client

    多次收发

    # 多次收发
    import socket
    
    sk = socket.socket(type=socket.SOCK_DGRAM)
    sk.bind(('127.0.0.1', 8091))
    user_dict = {}
    
    while True:
        msg_r, addr = sk.recvfrom(1024)
        msg_r = msg_r.decode('utf-8')
        if msg_r.upper() == 'Q':break
        elif 'name:' not in msg_r and user_dict.get(addr) == None:
            sk.sendto('你好啊,请提供你的名字格式为  name:张三  方便我们聊天.'.encode('utf-8'), addr)
        elif 'name:' in msg_r and user_dict.get(addr) == None:
            username = msg_r.split(":")[-1]
            if username in user_dict.values():
                sk.sendto('你好{},请换个名字,已经被用啦'.format(username).encode('utf-8'), addr)
                print('%s%s注册失败,名字重复' % (username, addr))
            else:
                user_dict[addr] = username
                sk.sendto('你好{},开始交流吧!'.format(username).encode('utf-8'), addr)
                print('%s%s注册成功' % (username, addr))
        else:
            print('Receive:%s%s Message:%s' % (user_dict[addr], addr, msg_r))
            msg_s = input('>>>')
            sk.sendto(msg_s.encode('utf-8'), addr)
            if msg_s.upper() == 'Q':
                break
            print('Reply%s: %s' % (user_dict[addr], msg_s))
    sk.close()
    # 多次收发 Server
    # 多次收发
    import socket
    
    sk = socket.socket(type=socket.SOCK_DGRAM)
    print('请输入你的名字')
    
    while True:
        msg_s = input('>>>')
        if msg_s.upper() == 'Q':break
        if times == 1:
            msg_s = 'name:'+msg_s
        sk.sendto(msg_s.encode('utf-8'), ('127.0.0.1', 8091))
        msg_r, addr = sk.recvfrom(1024)
        if msg_r.decode('utf-8').upper() == 'Q':
            break
        print('Receive:', msg_r.decode('utf-8'))
    
    sk.close()
    # 多次收发Client
    #格式:
      设置颜色开始 :33[显示方式;前景色;背景色m
    #说明:
    前景色            背景色           颜色
    ---------------------------------------
                   40              黑色
                   41              红色
                   42              绿色
                   43              黃色
                   44              蓝色
                   45              紫红色
                   46              青蓝色
                   47              白色
    显示方式           意义
    -------------------------
                   终端默认设置
                   高亮显示
                   使用下划线
                   闪烁
                   反白显示
                   不可见
     
    #例子:
    33[1;31;40m    <!--1-高亮显示 31-前景色红色  40-背景色黑色-->
    033[0m          <!--采用终端默认设置,即取消颜色设置-->
    终端打印颜色

    带颜色和署名的聊天

    # 多次收发,带颜色
    import socket
    import random
    
    sk = socket.socket(type=socket.SOCK_DGRAM)
    sk.bind(('192.168.12.59', 8091))
    user_dict = {}
    color_list = []
    
    def color_msg(addr,*args):
        if addr in user_dict and len(user_dict[addr]) == 1:
            while True:
                if len(color_list) == 64:
                    color = '33[1;31;42m{{}}33[0m'
                    break
                else:
                    color = '33[1;{};{}m{{}}33[0m'.format(random.randint(30,37),random.randint(40,47))
                    if color not in color_list:
                        color_list.append(color)
                        break
            user_dict[addr].append(color)
        else:
            return user_dict[addr][-1].format(*args)
    
    while True:
        msg_r, addr = sk.recvfrom(1024)
        msg_r = msg_r.decode('utf-8')
        if msg_r.upper() == 'Q':break
        elif 'name:' not in msg_r and user_dict.get(addr) == None:
            sk.sendto('你好啊,请提供你的名字格式为  name:张三  方便我们聊天.'.encode('utf-8'), addr)
        elif 'name:' in msg_r and user_dict.get(addr) == None:
            username = msg_r.split(":")[-1]
            if username in user_dict.values():
                sk.sendto('你好{},请换个名字,已经被用啦'.format(username).encode('utf-8'), addr)
                print('%s%s注册失败,名字重复' % (username, addr))
            else:
                user_dict[addr] = [username]
                color_msg(addr)
                sk.sendto('你好{},开始交流吧!'.format(username).encode('utf-8'), addr)
                print('%s%s注册成功' % (username, addr))
        else:
            print('Receive:%s%s Message:%s' % (user_dict[addr][0], addr, msg_r))
            msg_s = input('>>>')
            msg_s = color_msg(addr,msg_s)
            sk.sendto(msg_s.encode('utf-8'), addr)
            if msg_s.upper() == 'Q':
                break
            print('Reply%s: %s' % (user_dict[addr][0], msg_s))
    sk.close()
    带颜色server
    import socket
    
    sk = socket.socket(type=socket.SOCK_DGRAM)
    print('请输入你的名字')
    times = 0
    while True:
        times+=1
        msg_s = input('>>>')
        if msg_s.upper() == 'Q':break
        if times == 1:msg_s = 'name:'+msg_s
        sk.sendto(msg_s.encode('utf-8'), ('192.168.12.59', 8091))
    
        msg_r, addr = sk.recvfrom(1024)
        if msg_r.decode('utf-8').upper() == 'Q':break
        print('Receive:', msg_r.decode('utf-8'))
    
    sk.close()
    Client

    时间同步

    import socket
    import time
    
    sk = socket.socket(type=socket.SOCK_DGRAM)
    sk.bind(('127.0.0.1',8091))
    
    while True:
        time_format,addr = sk.recvfrom(1024)
        time_now = time.strftime(time_format.decode('utf-8'))
        print(time_now)
        sk.sendto(time_now.encode('utf-8'),addr)
    
    sk.close()
    server
    import socket
    import time
    
    print('''
    %Y-%m-%d %H:%M:%S
    ''')
    time_format = input('请输入时间格式>>>')
    sk = socket.socket(type=socket.SOCK_DGRAM)
    
    while True:
        sk.sendto(time_format.encode('utf-8'),('127.0.0.1',8091))
        time_now,addr = sk.recvfrom(1024)
        print(time_now.decode('utf-8'))
        time.sleep(2)
    sk.close()
    client

    自己实现socket 解决传输解码过程

    from socket import *
    
    
    class My_socket(socket):
        def __init__(self, coding='utf-8'):
            self.coding = coding
            super(My_socket, self).__init__(type=SOCK_DGRAM)  #执行父类init方法
    
        def my_recvfrom(self, buffersize):
            msg, addr = self.recvfrom(buffersize)
            return msg.decode(self.coding), addr
    
        def my_sendto(self, msg, addr):
            return self.sendto(msg.encode(self.coding), addr)
    My_socket
    from My_socket import My_socket
    
    sk = My_socket()
    sk.bind(('127.0.0.1', 8091))
    
    msg, addr = sk.my_recvfrom(1024)
    print(msg)
    
    sk.close()
    udp_server
    from My_socket import My_socket
    
    sk = My_socket()
    
    msg = input('>>>')
    sk.my_sendto(msg, ('127.0.0.1', 8091))
    
    sk.close()
    udp_client
  • 相关阅读:
    LVS集群ipvsadm命令和调度算法(6)
    Keepalived实战(3)
    keepalived配置文件详解(2)
    HDFS对象存储:Ozone的块异步删除服务
    状态机在分布式系统中的应用
    状态机在分布式系统中的应用
    HDFS Ozone整体概述
    HDFS Ozone的Pipeline实现机制
    HDFS Ozone整体概述
    HDFS数据不均衡解决方案:基于剩余空间大小的均衡策略
  • 原文地址:https://www.cnblogs.com/eailoo/p/9140568.html
Copyright © 2011-2022 走看看