Day34

Socket

基于TCP的socket

client端

import socket
sk=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()
View Code

server端

import socket
sk=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协议适用于 文件的上传和下载 发送邮件 发送重要的文件
# 每和一个客户端建立链接 都会在自己的操作系统上占用一个资源
# 同一时间 只能 和一个客户端通信
View Code

基于UDP的socket

client端

import socket
sk=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()
View Code

server端

import socket
lst={'egon':'33[1;31m','yuan':'33[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%s33[0m'%(color,msg.decode('utf-8')))
    inp=input('>>>')
    sk.sendto(inp.encode('utf-8'),client_addr)
sk.close()
View Code

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)
View Code

client端

from mysocket import Mysocket

sk = 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()
View Code

server端

from mysocket import Mysocket

sk = 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()
View Code

时间同步

client端

import time
import socket
sk=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()
View Code

server端

# 时间同步服务
# udp协议完成的
# 4、5 台机器
# 00:00 从一个文件里 读一些数据 明天的搜索
# 在一个机房里 有一台标准时间的服务器
# 机房里所有的机器 都每隔一段时间 就去请求这台服务器 来获取一个标准时间
import time
import socket
sk=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()
View Code
原文地址:https://www.cnblogs.com/a352735549/p/8990788.html