1. 服务端:
  2. import socketserver
  3. class Myserver(socketserver.BaseRequestHandler): #来一个链接产生一个实例
  4. def handle(self): #定义了一个通信循环的功能
  5. print(\'conn是:\',self.request) #相当于conn 既accept接收到的连接
  6. print(self.client_address) #相当于addr 既accept接收到的addr地址
  7. while True:
  8. try:
  9. #收消息
  10. data = self.request.recv(1024)
  11. if not data: break
  12. print(\'收到客户端的消息是:\',data,self.client_address)
  13. #发消息
  14. self.request.sendall(data.upper())
  15. except Exception as e:
  16. print(e)
  17. break
  18.  
  19. if __name__ == \'__main__\':
  20. s = socketserver.ThreadingTCPServer((\'127.0.0.1\',8000),Myserver) #多线程的TCP服务端 第一个参数是IP和端口 第二个参数相当于把通信循环加进去了
  21. s.serve_forever() #这两项相当于实现了链接循环 只要有链接进来 直接进入通信循环 执行myserver下的handle方法

    UDP版本:
  1. #UDP版本
    class Myserver(socketserver.BaseRequestHandler): #来一个链接产生一个实例
    def handle(self): #定义了一个通信循环的功能
    while True:
    data = self.request[0]
    print(data)
    self.request[1].sendto(self.request[0].upper(),self.client_address)
  1.  

socketserver中两大类:第一类:server类,处理链接 第二类:request类,处理通信

server类:

 

 request类:

 

继承关系:

  1. +------------+
    | BaseServer |
    +------------+
    |
    v
    +-----------+ +------------------+
    | TCPServer |------->| UnixStreamServer |
    +-----------+ +------------------+
    |
    v
    +-----------+ +--------------------+
    | UDPServer |------->| UnixDatagramServer |
    +-----------+ +--------------------+

 

 

 

 

利用hmac+加盐的方式来实现

客户端:

  1. #_*_coding:utf-8_*_
  2. __author__ = \'Linhaifeng\'
  3. from socket import *
  4. import hmac,os
  5. secret_key=b\'linhaifeng bang bang bang\'
  6. def conn_auth(conn):
  7. \'\'\'
  8. 认证客户端链接
  9. :param conn:
  10. :return:
  11. \'\'\'
  12. print(\'开始验证新链接的合法性\')
  13. msg=os.urandom(32)
  14. conn.sendall(msg)
  15. h=hmac.new(secret_key,msg) #将盐和随机产生的32位数组合生成一个新值
  16. digest=h.digest() #将新值转化为数字
  17. respone=conn.recv(len(digest)) #接收与数字同等长度的值
  18. return hmac.compare_digest(respone,digest) #将接收到的值和自己的值做比较,返回一个True或False
  19.  
  20. def data_handler(conn,bufsize=1024):
  21. if not conn_auth(conn):
  22. print(\'该链接不合法,关闭\')
  23. conn.close()
  24. return
  25. print(\'链接合法,开始通信\')
  26. while True:
  27. data=conn.recv(bufsize)
  28. if not data:break
  29. conn.sendall(data.upper())
  30. def server_handler(ip_port,bufsize,backlog=5):
  31. \'\'\'
  32. 只处理链接
  33. :param ip_port:
  34. :return:
  35. \'\'\'
  36. tcp_socket_server=socket(AF_INET,SOCK_STREAM)
  37. tcp_socket_server.bind(ip_port)
  38. tcp_socket_server.listen(backlog)
  39. while True:
  40. conn,addr=tcp_socket_server.accept()
  41. print(\'新连接[%s:%s]\' %(addr[0],addr[1]))
  42. data_handler(conn,bufsize)
  43. if __name__ == \'__main__\':
  44. ip_port=(\'127.0.0.1\',9999)
  45. bufsize=1024
  46. server_handler(ip_port,bufsize)

 

客户端:

  1. #_*_coding:utf-8_*_
  2. __author__ = \'Linhaifeng\'
  3. from socket import *
  4. import hmac,os
  5. secret_key=b\'linhaifeng bang bang bang\'
  6. def conn_auth(conn):
  7. \'\'\'
  8. 验证客户端到服务器的链接
  9. :param conn:
  10. :return:
  11. \'\'\'
  12. msg=conn.recv(32)
  13. h=hmac.new(secret_key,msg)
  14. digest=h.digest()
  15. conn.sendall(digest)
  16. def client_handler(ip_port,bufsize=1024):
  17. tcp_socket_client=socket(AF_INET,SOCK_STREAM)
  18. tcp_socket_client.connect(ip_port)
  19. conn_auth(tcp_socket_client)
  20. while True:
  21. data=input(\'>>: \').strip()
  22. if not data:continue
  23. if data == \'quit\':break
  24. tcp_socket_client.sendall(data.encode(\'utf-8\'))
  25. respone=tcp_socket_client.recv(bufsize)
  26. print(respone.decode(\'utf-8\'))
  27. tcp_socket_client.close()
  28. if __name__ == \'__main__\':
  29. ip_port=(\'127.0.0.1\',9999)
  30. bufsize=1024
  31. client_handler(ip_port,bufsize)

客户端

 

版权声明:本文为caixiaowu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/caixiaowu/p/12489436.html