补充:

send()与sendall()

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

socket.send(string[, flags])  发送TCP数据,返回发送的字节大小。这个字节长度可能少于实际要发送的数据的长度。换句话说,这个函数执行一次,并不一定能发送完给定的数据,可能需要重复多次才能发送完成。

data = "something you want to send"
while True:
len = s.send(data[len:])
if not len:
break

socket.sendall(string[, flags])   看懂了上面那个,这个函数就容易明白了。发送完整的TCP数据,成功返回None,失败抛出异常

data = "something you want to send" 

s.sendall(data)

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

一 、socketv 验证客户端链接的合法性

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

import hashlib
import socket
sk =socket.socket()
sk.bind(('127.0.0.1',8083))
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(1024).decode('utf-8'):
print("客户端为合法身份")
else: print("客户端为非法身份")

Server端

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

client

对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 = os.urandom(32)
conn.send(send_str)
md5_obj =hmac.new(secret_key,send_str)
secret_ret =md5_obj.digest() hmac #摘要后的结果是bytes
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

#服务器端

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

客户端

socketv 验证客户端链接的合法性,socketserver的更多相关文章

  1. socketv 验证客户端链接的合法性

    一 .socketv 验证客户端链接的合法性 send()与sendall() 验证客户端 加密验证 如果你想在分布式系统中实现一个简单的客户端链接认证功能,又不像SSL那么复杂,那么利用hmac+加 ...

  2. python (大文件下载及进度条展示) 验证客户端链接的合法性,socketserver

    ##########总结########### 文件校验加进度条显示 ####server import os import json import socket import struct impo ...

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

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

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

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

  5. python:验证客户端链接的合法性与socketserver

    一.验证客户端链接的合法性 from socket import * import hmac,os secret_key=b'linhaifeng bang bang bang' def conn_a ...

  6. python网络编程之验证客户端链接的合法性

    六.socket的更多方法介绍 服务端套接字函数s.bind() 绑定(主机,端口号)到套接字s.listen() 开始TCP监听s.accept() b被动接收TCP客户的连接,(阻塞式)等待连接的 ...

  7. 《Python》网络编程之验证客户端连接的合法性、socketserver模块

    一.socket的更多方法介绍 # 服务端套接字函数 s.bind() # 绑定(主机,端口号)到套接字 s.listen() # 开始TCP监听 s.accept() # 被动接受TCP客户的连接, ...

  8. python之路----验证客户端合法性

    验证客户端链接的合法性 import os import hmac import socket secret_key = b'egg' sk = socket.socket() sk.bind(('1 ...

  9. 验证客户端的链接合法性和socketserver模块实现并发

    本节内容: 1.验证客户端的链接合法性 2.socketserver模块实现并发 一.验证客户端的链接合法性 首先,我们来探讨一下,什么叫验证合法性, 举个例子:有一天,我开了一个socket服务端, ...

随机推荐

  1. 除了binlog2sql工具外,使用python脚本闪回数据(数据库误操作)

    利用binlog日志恢复数据库误操作数据 在人工手动进行一些数据库写操作的时候(比方说数据修改),尤其是一些不可控的批量更新或删除,通常都建议备份后操作.不过不怕万一,就怕一万,有备无患总是好的.在线 ...

  2. Springboot中使用Xstream进行XML与Bean 相互转换

    在现今的项目开发中,虽然数据的传输大部分都是用json格式来进行传输,但是xml毕竟也会有一些老的项目在进行使用,正常的老式方法是通过获取节点来进行一系列操作,个人感觉太过于复杂.繁琐.推荐一套简单的 ...

  3. 一、kubeadm安装

    一.官网 https://kubernetes.io/zh/docs/setup/independent/install-kubeadm/ 阿里云 kubernetes yum 仓库镜像 安装kube ...

  4. Lodop获取全部JS代码,传统JS模版的生成

    Lodop模版有两种方法,一种是传统的JS语句,可以用JS方法里的eval来执行,一种是文档式模版,是特殊格式的base64码,此篇博文介绍传统JS模版的生成方法.两种模版都可以存入一下地方进行调用, ...

  5. Django框架中的Context使用

    Django框架中的Context使用 2017年11月09日 20:01:09 aweilark 阅读数:1113   转载自:http://www.aichengxu.com/python/606 ...

  6. 面向对象—的__new__()方法详解

    [Python] Python 之 __new__() 方法与实例化   __new__() 是在新式类中新出现的方法,它作用在构造方法建造实例之前,可以这么理解,在 Python 中存在于类里面的构 ...

  7. 【XSY2721】求和 杜教筛

    题目描述 设\(n=\prod a_i^{p_i}\),那么定义\(f_d(n)=\prod{(-1)^{p_i}[p_i\leq d]}\).特别的,\(f_1(n)=\mu(n)\). 给你\(n ...

  8. Collect devices information

    Collect devices information root@vpx-test# kenv > kenv.txt root@vpx-test# sysctl -a > sysctl_a ...

  9. Awesome-3d

    1.素描-你的3D内容在网络,移动,AR,和虚拟现实. 2.跨平台AR SDK =======================

  10. 解决"mysql-bin.000001"占用超大空间的问题

    描述:mysql-bin.000001.mysql-bin.000002等文件是数据库的操作日志,例如UPDATE一个表,或者DELETE一些数据,即使该语句没有匹配的数据,这个命令也会存储到日志文件 ...