网络编程- socket_server_登录demo

userinfo文件

alex|aee949757a2e698417463d47acac93df

server_login

import json
import hashlib
import socketserver
def md5_pwd(user,pwd):
md5_obj = hashlib.md5(user.encode('utf-8'))
md5_obj.update(pwd.encode('utf-8'))
ret = md5_obj.hexdigest()
return ret

def login(userinfo):
user_dic = json.loads(userinfo)
passwd = md5_pwd(user_dic['username'], user_dic['passwd'])
with open('userinfo') as f:
for line in f:
user, pwd = line.split('|')
if user_dic['username'] == user and passwd == pwd:
print('登录成功')
break

class MyServer(socketserver.BaseRequestHandler):
def handle(self):
userinfo = self.request.recv(1024).decode('utf-8')
login(userinfo)

server = socketserver.ThreadingTCPServer(
('127.0.0.1',9000),
MyServer)
server.serve_forever()

client_login

import json
import socket
ADDR = ('127.0.0.1',9000)
def get_socket():
sk = socket.socket()
sk.connect(ADDR)
return sk
# 输入账号
username = input('username >>>')
passwd = input('password >>>')
if username.strip() and passwd.strip():
sk = get_socket()
dic = {'username':username,'passwd':passwd}
str_dic = json.dumps(dic)
sk.send(str_dic.encode('utf-8'))
sk.close()
# 连接socket


复习总结
# 网络编程
# 互联网协议 —— 七层 :osi协议
# 五层
# 应用层 python
# 传输层 tcp/udp
# 网络层 ip 路由器
# 数据链路层 arp 交换机
# 物理层 网卡 双绞线
# arp 通过ip找mac地址
# 交换机 :广播 单播 组播
# ip协议 :ip地址的格式
# ip地址 一台机器在一个网络内唯一的标识
# 子网掩码 ip地址与子网掩码做按位与运算,得到的结果是网段
# 网关ip 局域网内的机器访问公网ip,就通过网关访问
# tcp 面向流的 可靠 全双工 三次握手 四次挥手 —— 黏包
# udp 面向数据包 不可靠

# 黏包
# 什么是黏包
# 怎么解决
# 在发送信息信息之前 先告诉对方要发的数据有多大
# struct模块将要发送数据的大小固定化,无论如何就发4个字节
# 自定义协议的概念

# 验证客户端合法性 hmac

# 处理并发问题
# socketserver

原文地址:https://www.cnblogs.com/mys6/p/10801516.html