一 、getpeername和getsoketopt的用法

服务器端代码

import socket
sk =socket.socket()
sk.bind(('127.0.0.1',9000))
sk.listen()
conn,addr =sk.accept()
conn.send(b'gdadfadsd')
print('getpeername:\n',conn.getpeername()) #连接到当前套接字的远端地址.
print('getsocketop:\n',sk.getsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR))#返回指定套接字的参数
conn.recv(1024)
conn.close()
sk.close()

结果

客户端代码

import socket
sk=socket.socket()
sk.connect(('127.0.0.1',9000))
sk.send(b'helllo')
ret =sk.recv(1024)
print(ret)
sk.close()

二 、将对server与client双向传输的数据进行md5加密操作()

验证客户端的合法性

Server端
import hashlib
import socket
sk =socket.socket()
sk.bind(('127.0.0.1',))
sk.listen()
conn,addr =sk.accept()
send_str ="helloword"
secret_key = b'hello'
conn.send(send_str.encode('utf-8'))#把字符串发过去 #留着比对用
md5_obj =hashlib.md5(secret_key)#md5加密
md5_obj.update(send_str.encode('utf-8')) #send_str进行加密,留着然后和client返回的做对比
sercret_ret =md5_obj.hexdigest() # 摘要之后是一串字符串.
print(sercret_ret) # conn.send(sercret_ret.encode('utf-8')) if sercret_ret ==conn.recv().decode('utf-8'):
print("客户端为合法身份")
else: print("客户端为非法身份")


客户端
import socket
import hashlib
ADDR = ('127.0.0.1',8083)
sk =socket.socket()
sk.connect(ADDR) secret_key = b'hello'
md5_obj =hashlib.md5(secret_key)
msg = sk.recv(1024)
print(msg.decode('utf-8'))
md5_obj.update(msg)
secret_ret =md5_obj.hexdigest()#摘要结果为字符串格式.
print(secret_ret)
sk.send(secret_ret.encode('utf-8')) 输出结果


服务器端

import os
import socket
import hashlib
def check_client(conn):
secret_key =b'egg'#秘钥
send_str ='这是一个随机的字符串'
conn.send(send_str.encode('utf-8'))
md5_obj =hashlib.md5(secret_key) #加盐也要转换成bytes类型
md5_obj.update(send_str.encode('utf-8'))# update摘要必须是byte类型.
secret_ret =md5_obj.hexdigest() #摘要后的结果字符串类型str
if conn.recv(1024).decode('utf-8')==secret_ret:
print('合法的客户端')
return True
else:
print('非法的客户端')
return False
sk =socket.socket()
sk.bind(('127.0.0.1',8000))
sk.listen()
conn,addr =sk.accept()
check_client(conn)
conn.close()
sk.close()

输出结果:

客户端

import socket 
import hashlib
sk=socket.socket()
sk.connect(('127.0.0.1',8000))
recv =sk.recv(1025)
#用相同的手法对这个字符串进行摘要.
secret_key = b'egg'#秘钥
md5_obj = hashlib.md5(secret_key) #加盐的方式进行md5加密.
md5_obj.update(recv) #摘要以bytes类型摘要.
ret = md5_obj.hexdigest() #加密后是字符串的形式.
sk.send(ret.encode('utf-8')) # 发送以bytes类型发送.
sk.close()

三 、将对server与client双向传输的数据进行md5加密操作(),然后制作了一个小聊天工具. 

服务器端

import os
import socket
import hashlib
def check_client(conn):
secret_key =b'egg'#秘钥
send_str ='这是一个随机的字符串'
conn.send(send_str.encode('utf-8'))
md5_obj =hashlib.md5(secret_key) #加盐也要转换成bytes类型
md5_obj.update(send_str.encode('utf-8'))# update摘要必须是byte类型.
secret_ret =md5_obj.hexdigest() #摘要后的结果字符串类型str
if conn.recv(1024).decode('utf-8')==secret_ret:
print('合法的客户端')
return True
else:
print('非法的客户端')
return False
sk =socket.socket()
sk.bind(('127.0.0.1',8002))
sk.listen()
conn,addr =sk.accept()
ret = check_client(conn)
while ret :
inp = input('>>>>')
conn.send(inp.encode('utf-8'))
msg = conn.recv(1024)
print(msg.decode('utf-8'))
conn.close()
sk.close()

结果

 客户端:

import socket
import hashlib
sk = socket.socket()
sk.connect(('127.0.0.1',8002))
recv =sk.recv(1024)
#用相同的手法对这个字符串进行摘要.
secret_key = b'egg'#秘钥
md5_obj = hashlib.md5(secret_key) #加盐的方式进行md5加密.
md5_obj.update(recv) #摘要以bytes类型摘要.
ret = md5_obj.hexdigest() #加密后是字符串的形式.
sk.send(ret.encode('utf-8')) # 发送以bytes类型发送.
msg =sk.recv(1024)
if msg:
print(msg.decode('utf-8'))
while True:
inp = input(">>>>")
sk.send(inp.encode('utf-8'))
msg =sk.recv(1024)
print(msg.decode('utf-8'))
sk.close()

结果:

 四 、验证客户端合法性的方法HMAC

import os
import hmac
#内置模块
#简单的网络编程中的客户端合法性验证。
ret =os.urandom(32)
print(os.urandom(32))#每次运行都会生成一个32位的随机字节
# 输出结果
# b'\xa8=\xd2}\xe2\xdcc\xbd\xc3X\xf4\xe2\xcfW\xe02LD\xd8\xa0\x10e\xbcR0\x02\xf8\xc1\x0ez9\xf1' hmac_obj =hmac.new(b'egg',ret)
ret2 =hmac_obj.digest()
print(ret2)
# 输出结果
# b'\xf9\x0c\xa8{\xb1\xb0\xf7\xda\xa7\xb9\x8d\xe3\x1f\x9e\xa0\x87'
#

服务器端

import hmac 
import os
import socket
import hmac
def check_client(conn):
secret_key =b'egg'#秘钥
send_str ='这是一个随机的字符串'
  send_str = os.urandom(32)
conn.send(send_str.encode('utf-8'))
  conn.send(send_str)
md5_obj =hashlib.md5(secret_key) #加盐也要转换成bytes类型
  md5_obj =hmac.new(secret_key,send_str)
md5_obj.update(send_str.encode('utf-8'))# update摘要必须是byte类型.
secret_ret =md5_obj.hexdigest() #摘要后的结果字符串类型str
  secret_ret =md5_obj.digest() hmac 摘要后的结果是bytes
    if conn.recv(1024).decode('utf-8')==secret_ret:
    if conn.recv(1024)==secret_ret:  两个bytes类型进行对比 
        print('合法的客户端')
return True
else:
print('非法的客户端')
return False
sk =socket.socket()
sk.bind(('127.0.0.1',8002))
sk.listen()
conn,addr =sk.accept()
ret = check_client(conn)
while ret :
inp = input('>>>>')
conn.send(inp.encode('utf-8'))
msg = conn.recv(1024)
print(msg.decode('utf-8'))
conn.close()
sk.close()
 

客户端

# sk.connect(('127.0.0.1',8002))
# recv =sk.recv(1024)
# #用相同的手法对这个字符串进行摘要.
# secret_key = b'egg'#秘钥
# md5_obj = hashlib.md5(secret_key) #加盐的方式进行md5加密.
md5_obj=hmac.new(secret_key,recv)
# ret = md5_obj.digest() #加密后是字符串的形式.
# sk.send(ret.encode('utf-8')) # 发送以bytes类型发送.
# sk.send(ret) # # msg =sk.recv(1024)
# if msg:
# print(msg.decode('utf-8'))
# while True:
# inp = input(">>>>")
# sk.send(inp.encode('utf-8'))
# msg =sk.recv(1024)
# print(msg.decode('utf-8'))
# sk.close()

五、socketserver

tcp的问题 : 1 黏包

      2 . 线程不释放.

服务器端

import socketserver
class MyServer(socketserver.BaseRequestHandler):
def handle(self):
self.request.send(b'hello') #conn
msg=self.request.recv(1024).decode('utf-8')
print(msg)
server = socketserver.ThreadingTCPServer(
('127.0.0.1',9000),
MyServer)
server.serve_forever()

客户端

import socket
sk =socket.socket()
sk.connect(('127.0.0.1',9000))
print(sk.recv(1024))
msg= input(">>>>").encode('utf-8')
sk.send(msg)
sk.close()

服务器端

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

客户端

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

六 、 作业题 

Day 35 验证客户端的合法性+socketserver的更多相关文章

  1. 总结day26 ----验证客户端的合法性,已经操作系统,进程的简单初识别

    前情提要 一:验证客户端的合法性: # .需要认证 # 程序和用户打交道的时候才会用到用户认证 # 对所有的客户端进行统一的认证 # # 我现在要做的事情 # 写一个server端 # 写一个clie ...

  2. 验证客户端的合法性、socketserver模块

    一.为了防止客户端被人非法利用,需要在使用之前对客户端进行合法性验证.接下来就是客户端验证的几种方法 hmac  加密方法 import socket import os import hmac #能 ...

  3. python_网络编程hmac模块验证客户端的合法性

    hmac模块: 比较两个函数的密钥是否一致: import hmac import os msg = os.urandom(32) #生成32位随机字节码 def wdc(): key = b'wdc ...

  4. 用hmac验证客户端的合法性

    服务器端程序 import os import hmac import socket def auth(conn): secret_key = b'rock' rand_b = os.urandom( ...

  5. python 验证客户端的合法性

    目的:对连接服务器的客户端进行判断 # Server import socket import hmac import os secret_key = bytes('tom', encoding='u ...

  6. socketserver和socket的补充(验证客户端合法性)

    一.socket的补充 1.参数 socket.socket(family=AF_INET,type=SOCK_STREAM,proto=0,fileno=None) 参数说明: family 地址系 ...

  7. python 全栈开发,Day36(作业讲解(大文件下载以及进度条展示),socket的更多方法介绍,验证客户端链接的合法性hmac,socketserver)

     先来回顾一下昨天的内容 黏包现象粘包现象的成因 : tcp协议的特点 面向流的 为了保证可靠传输 所以有很多优化的机制 无边界 所有在连接建立的基础上传递的数据之间没有界限 收发消息很有可能不完全相 ...

  8. Python之socketserver模块和验证客户端链接的合法性

    验证客户端链接的合法性 分布式系统中实现一个简单的客户端链接认证功能 #_*_coding:utf-8_*_ from socket import * import hmac,os secret_ke ...

  9. socketv 验证客户端链接的合法性,socketserver

    补充: send()与sendall() 在python socket编程中,有两个发送TCP的函数,send()与sendall(),区别如下: socket.send(string[, flags ...

随机推荐

  1. 使用jmeter工具测试上传接口

    1.方法选择post:上传都是post上传. 2.路径输入正确的上传接口路径,并勾选Use multipart/form-data for POST 3.添加文件,文件路径尽量不要有中文,防止编码问题 ...

  2. PS、AI、AE常用快捷键大全

    PS,AI,AE最常用的快捷键来了. 注意:Mac用户请自觉把Ctrl换成Command理解就行. 2017 Adobe Photoshop CC 快捷键 2017Adobe Illustrator快 ...

  3. JVM 系列 ClassLoader

    JVM 系列()ClassLoader 在前面一节中,主要介绍了 Class 的装载过程,Class 的装载大体上可以分为加载类.连接类和初始化 3 个阶段.本小节将主要介绍绍 Java 语言中的 C ...

  4. url地址 参数 带 参数 注意事项 , chain , redirect , redirectAction

    当 url  地址中含有  参数 时 ,若参数值是一个 含有 参数的 地址时 , 应警惕 ,如 index/goIndex!login?backUrl=/shop/goShop!go?a1=1& ...

  5. PythonWEB框架之Flask--2

    10.请求扩展 1 before_request 类比django中间件中的process_request,在青丘收到之前绑定一个函数做一些事情 #基于它做用户登录认证 @app.before_req ...

  6. SQLInjection 靶场配置

    对于渗透,太小型的网站没有太大价值,而大型网站(比如各种电商平台)对于代码审计往往非常严格,新手基本找不到漏洞,而一些比较容易搞掉的站点(政府.gov.各种教育网站.edu或者很多商业中型站点)渗透又 ...

  7. 521. Longest Uncommon Subsequence I

    static int wing=[]() { std::ios::sync_with_stdio(false); cin.tie(NULL); ; }(); class Solution { publ ...

  8. 2018.09.09 poj2949Word Rings(01分数规划+spfa判环)

    传送门 这题要先巧妙的转化一下. 对于每个字符串,我们把头尾的两个小字符串对应的点连边,边权是这个字符串的长度. 这样最多会出现26*26个点. 这个时候就只用求出边权和跟边数的最大比值了. 这个显然 ...

  9. python pip国内源

    pip国内的这个源最快   清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/ 修改源方法: 临时使用: 可以在使用pip的时候在后面加上-i参数,指定pip ...

  10. Spring Boot的自动配置的原理浅析

    一.原理描述 Spring Boot在进行SpringApplication对象实例化时会加载META-INF/spring.factories文件,将该配置文件中的配置载入到Spring容器. 二. ...