#服务端
 import socketserver

 class Myserver(socketserver.BaseRequestHandler):

     def handle(self):
         while 1:
             from_client_msg = self.request.recv(1024)  # self.request = conn
             print(from_client_msg.decode('utf-8'))
             msg = input('服务端说:')
             self.request.send(msg.encode('utf-8'))

 if __name__ == '__main__':

     ip_port = ('127.0.0.1',8001)

     server = socketserver.ThreadingTCPServer(ip_port,Myserver)

     server.serve_forever()
# 客户端
import socket
client = socket.socket()
client.connect(('127.0.0.1',8001))

while 1:
    msg = input('客户端说>>>')
    client.send(msg.encode('utf-8'))

    from_server_msg = client.recv(1024)

    print(from_server_msg.decode('utf-8'))
 # 验证合法连接的服务端
 from socket import *
 import hmac,os

 secret_key=b'Jedan has a big key!'
 def conn_auth(conn):
     '''
     认证客户端链接
     :param conn:
     :return:
     '''
     print('开始验证新链接的合法性')
     msg=os.urandom(32)#生成一个32字节的随机字符串
     conn.sendall(msg)
     h=hmac.new(secret_key,msg)
     digest=h.digest()
     respone=conn.recv(len(digest))
     return hmac.compare_digest(respone,digest)

 def data_handler(conn,bufsize=1024):
     if not conn_auth(conn):
         print('该链接不合法,关闭')
         conn.close()
         return
     print('链接合法,开始通信')
     while True:
         data=conn.recv(bufsize)
         if not data:break
         conn.sendall(data.upper())

 def server_handler(ip_port,bufsize,backlog=5):
     '''
     只处理链接
     :param ip_port:
     :return:
     '''
     tcp_socket_server=socket(AF_INET,SOCK_STREAM)
     tcp_socket_server.bind(ip_port)
     tcp_socket_server.listen(backlog)
     while True:
         conn,addr=tcp_socket_server.accept()
         print('新连接[%s:%s]' %(addr[0],addr[1]))
         data_handler(conn,bufsize)

 if __name__ == '__main__':
     ip_port=('127.0.0.1',9999)
     bufsize=1024
     server_handler(ip_port,bufsize)
 #验证合法连接的客户端
 from socket import *
 import hmac,os

 secret_key=b'Jedan has a big key!'
 def conn_auth(conn):
     '''
     验证客户端到服务器的链接
     :param conn:
     :return:
     '''
     msg=conn.recv(32)
     h=hmac.new(secret_key,msg)
     digest=h.digest()
     conn.sendall(digest)

 def client_handler(ip_port,bufsize=1024):
     tcp_socket_client=socket(AF_INET,SOCK_STREAM)
     tcp_socket_client.connect(ip_port)

     conn_auth(tcp_socket_client)

     while True:
         data=input('>>: ').strip()
         if not data:continue
         if data == 'quit':break

         tcp_socket_client.sendall(data.encode('utf-8'))
         respone=tcp_socket_client.recv(bufsize)
         print(respone.decode('utf-8'))
     tcp_socket_client.close()

 if __name__ == '__main__':
     ip_port=('127.0.0.1',9999)
     bufsize=1024
     client_handler(ip_port,bufsize)

网络编程-day4的更多相关文章

  1. 猫哥网络编程系列:HTTP PEM 万能调试法

    注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...

  2. python select网络编程详细介绍

    刚看了反应堆模式的原理,特意复习了socket编程,本文主要介绍python的基本socket使用和select使用,主要用于了解socket通信过程 一.socket模块 socket - Low- ...

  3. Linux Socket 网络编程

    Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...

  4. 猫哥网络编程系列:详解 BAT 面试题

    从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...

  5. 浅谈C#网络编程(一)

    阅读目录: 基础 Socket编程 多线程并发 阻塞式同步IO 基础 在现今软件开发中,网络编程是非常重要的一部分,本文简要介绍下网络编程的概念和实践. Socket是一种网络编程接口,它是对传输层T ...

  6. C++11网络编程

    Handy是一个简洁优雅的C++11网络库,适用于linux与Mac平台.十行代码即可完成一个完整的网络服务器. 下面是echo服务器的代码: #include <handy/handy.h&g ...

  7. Java - 网络编程

    Java的网络编程学习,关于计算机基础的学习参考:计算机网络基础学习 - sqh.     参考:  

  8. Linux网络编程-IO复用技术

    IO复用是Linux中的IO模型之一,IO复用就是进程预先告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程进程处理,从而不会在单个IO上阻塞了.Linux中,提 ...

  9. Python Socket 网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

随机推荐

  1. 模板 RMQ问题ST表实现/单调队列

    RMQ (Range Minimum/Maximum Query)问题是指: 对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,R ...

  2. ES6常用语法(上)

    ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了.它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应 ...

  3. 【FJOI 20170305】省选模拟赛

    题面被改成了个猪... T1猪猪划船(boat) [题目描述] 6只可爱的猪猪们一起旅游,其中有3只大猪A,B,C,他们的孩子为3只小猪a,b,c.由于猪猪们十分凶残,如果小猪在没有父母监护的情况下, ...

  4. GAN 旧照上色

    https://www.jiqizhixin.com/articles/2018-11-03-3

  5. Request类源码分析

    通过APIView进入找到Request的源码 可以看见一堆属性和方法,其中request.data其实是一个方法,被包装成一个属性 继续看__getattr__和query_params方法: 代码 ...

  6. 基于SVD的图像压缩

    算法简介 算法实现 我只是简单处理了一下图像的灰度值,如果要处理RGB值的话,就需要分别进行SVD分解,最后再合起来即可. import numpy as np from PIL import Ima ...

  7. Jmeter 常见错误

    常见错误 https://testerhome.com/topics/10950 接口测试 https://blog.csdn.net/github_27109687/article/details/ ...

  8. windows系统如何查看端口被占用、杀进程

    1.首先启动windows的命令窗口 2.进入windows命令窗口之后,输入netstat -ano,就可以看到系统当前所有的端口使用情况 3.通过命令查找某一特定端口,在命令窗口中输入命令中输入n ...

  9. PostgreSQL 与 PostGIS

    PostgreSQL 是一种对象-关系型数据库管理系统(ORDBMS),也是目前功能最强大.特性最丰富和最复杂的自由软件数据库系统.它起源于伯克利(BSD)的数据库研究计划,目前是最重要的开源数据库产 ...

  10. python yaml用法详解

    YAML是一种直观的能够被电脑识别的的数据序列化格式,容易被人类阅读,并且容易和脚本语言交互.YAML类似于XML,但是语法比XML简单得多,对于转化成数组或可以hash的数据时是很简单有效的. Py ...