28 练习:TCP协议 UDP协议 黏包

# 1.基于tcp协议完成登录认证
# 客户端输入用户名密码
# 发送到服务端
# 服务端认证
# 发送结果到客户端

# server.py
import socket
import struct

REGISTER_PATH = 'register'
User = None
sk = socket.socket()
sk.bind(('127.0.0.1', 9000))
sk.listen()

conn, addr = sk.accept()
b_length = conn.recv(4)
length = struct.unpack('i', b_length)[0]
username = conn.recv(length)
b_length = conn.recv(4)
length = struct.unpack('i', b_length)[0]
password = conn.recv(length)
with open(REGISTER_PATH, encoding='utf-8', mode='r') as file_handler:
    for line in file_handler:
        cmp_username, cmp_password = line.strip().split('|')
        if cmp_username == username and cmp_password == password:
            conn.send('login success.'.encode('utf-8'))
            User = username
    if User is None:
        conn.send('login fail.'.encode('utf-8'))
conn.close()

sk.close()

# client.py
import socket
import struct

sk = socket.socket()
sk.connect(('127.0.0.1', 9000))

username = input('username>>>')
password = input('password>>>')
b_length = struct.pack('i', len(username))
sk.send(b_length)
sk.send(username.encode('utf-8'))
b_length = struct.pack('i', len(password))
sk.send(b_length)
sk.send(password.encode('utf-8'))
ret = sk.recv(1024)
print(ret)

sk.close()

# 2.基于udp协议的多人聊天
# 自动识别用户 不能用ip和port

# server.py
import socket
import random

sk = socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1', 9000))
color_dic = {}

while True:
    info, addr = sk.recvfrom(1024)
    name, msg = info.decode('utf-8').strip().split('|')
    if name not in color_dic:
        while True:
            forecolor_num = random.randint(31, 37)
            color_dic.setdefault(name, forecolor_num)
    print(f'\033[{color_dic[name]}m: msg')
    r_msg = input('>>>')
    sk.sendto(r_msg.encode('utf-8'), addr)

sk.close()

# client.py
import socket

sk = socket.socket(type=socket.SOCK_DGRAM)
server = ('127.0.0.1', 9000)

name = input('name>>>')
while True:
    msg = input('>>>')
    send_bytes = (name + '|' + msg).encode('utf-8')
    sk.sendto(send_bytes, server)
    r_msg = sk.recv(1024).decode('utf-8')
    if r_msg.upper() == 'Q':
        break
    print(r_msg)

sk.close()
# 3.基于tcp协议完成一个文件的上传
# 小文件

# server.py
import socket
import struct

sk = socket.socket()
sk.bind(('127.0.0.1', 9000))
sk.listen()

conn, addr = sk.accept()
b_length = conn.recv(4)
length = struct.unpack('i', b_length)[0]
file_name = conn.recv(length).decode('utf-8')
b_length = conn.recv(4)
length = struct.unpack('i', b_length)[0]
file_data = conn.recv(length)
with open(file_name + '.bak', mode='wb') as file_handler:
    file_handler.write(file_data)
conn.close()

sk.close()

# client.py
import socket
import struct

sk = socket.socket()

sk.connect(('127.0.0.1', 9000))
file_name = input('filename>>>')
b_length = struct.pack('i', len(file_name))
sk.send(b_length)
sk.send(file_name.encode('utf-8'))
with open(file_name, mode='rb') as file_handler:
    file_data = file_handler.read()
b_length = struct.pack('i', len(file_data))
sk.send(b_length)
sk.send(file_data)

sk.close()

猜你喜欢

转载自www.cnblogs.com/raygor/p/13394667.html