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
#格式:
  设置颜色开始 :\033[显示方式;前景色;背景色m
#说明:
前景色            背景色           颜色
---------------------------------------
               40              黑色
               41              红色
               42              绿色
               43              黃色
               44              蓝色
               45              紫红色
               46              青蓝色
               47              白色
显示方式           意义
-------------------------
               终端默认设置
               高亮显示
               使用下划线
               闪烁
               反白显示
               不可见
 
#例子:
\033[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 = '\033[1;31;42m{{}}\033[0m'
                break
            else:
                color = '\033[1;{};{}m{{}}\033[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

猜你喜欢

转载自www.cnblogs.com/eailoo/p/9140568.html