Socket
基于TCP的socket
client端
import socketsk=sk.socket.socket()sk.connect(('127.0.0.1',9000))while True: inp=input(">>>") sk.send(inp.encode('utf-8')) if inp=='q':break ret=sk.recv(1024).decode('utf-8') if ret=='q':break print(ret)sk.close()
server端
import socketsk=sk.socket.socket()sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEDDR,1)sk.bind(('127.0.0.1',9000))sk.listen() #参数n表示同一时间可以有n个链接等待与server端通信while True: conn,addr=sk.accept() while True: ret=conn.recv(1024).decode('utf-8') if ret=='q':break print(ret) inp=input('>>>') conn.send(inp.encode('utf-8')) if inp=='q':break conn.close()sk.close()# tcp协议适用于 文件的上传和下载 发送邮件 发送重要的文件# 每和一个客户端建立链接 都会在自己的操作系统上占用一个资源# 同一时间 只能 和一个客户端通信
基于UDP的socket
client端
import socketsk=socket.socket(type=socket.SOCK_DGRAM)name=input('name:')while True: inp=input('>>>') sk.sendto(('%s:%s'%(name,inp)).encode('utf-8'),('127.0.0.1',9090)) msg,addr=sk.recvfrom(1024) print(msg.decode('utf-8'))sk.close()
server端
import socketlst={ 'egon':'\033[1;31m','yuan':'\033[1;34m'}sk=socket.socket(type=socket_DGRAM)sk.bind(('127.0.0.1',9090))while True: msg,client_addr=sk.recvfrom(1024) name,msg=msg.decode('utf-8').spilt(':') color=lst.get(name.strip(),'') print('%s%s\033[0m'%(color,msg.decode('utf-8'))) inp=input('>>>') sk.sendto(inp.encode('utf-8'),client_addr)sk.close()
UDP进阶
mysocket
from socket import *class Mysocket(socket): def __init__(self,coding='utf-8'): super().__init__(type=SOCK_DGRAM) self.coding=coding def my_recv(self,num): msg,addr=self.recvfrom(num) return msg.decode(self.coding),addr def my_send(self,msg,addr): return self.sendto(msg.encode(self.coding),addr)
client端
from mysocket import Mysocketsk = Mysocket()while True: inp = input('>>>') if inp == 'q':break sk.my_send(inp,('127.0.0.1',9090)) msg,addr = sk.my_recv(1024) if msg == 'q':break print(msg)sk.close()
server端
from mysocket import Mysocketsk = Mysocket()sk.bind(('127.0.0.1',9090))while True: msg,client_addr= sk.my_recv(1024) # udp协议不用建立链接 print(msg) inp = input('>>>') sk.my_send(inp,client_addr)sk.close()
时间同步
client端
import timeimport socketsk=socket.socket(type=socket.SOCK_DGRAM)while True: sk.sendto('%Y/%m/%d %H:%M:%S'.encode('utf-8'),('127.0.0.1',9090)) ret,addr=sk.recvfrom(1024) print(ret.decode('utf-8')) time.sleep(1)sk.close()
server端
# 时间同步服务# udp协议完成的# 4、5 台机器# 00:00 从一个文件里 读一些数据 明天的搜索# 在一个机房里 有一台标准时间的服务器# 机房里所有的机器 都每隔一段时间 就去请求这台服务器 来获取一个标准时间import timeimport socketsk=socket.socket(type=socket.SOCK_DGRAM)sk.bind(('127.0.0.1',9090))while True: msg,addr=sk.recvfrom(1024) sk.sendto(time.strftime(msg.decode('utf-8')).encode('utf-8'),addr)sk.close()