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

 

自己实现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

 

posted @ 2018-06-05 16:45  eailoo  阅读(146)  评论(0编辑  收藏  举报