# 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()