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()
#一次收发 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()
多次收发
# 多次收发 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()
# 多次收发 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()
#格式: 设置颜色开始 :\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()
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()
时间同步
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()
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()
自己实现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)
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()
from My_socket import My_socket sk = My_socket() msg = input('>>>') sk.my_sendto(msg, ('127.0.0.1', 8091)) sk.close()