当前位置:
首页 > temp > python入门教程 >
-
03Python网络编程系列之服务端
# 这里边是一个定义了服务端的一系列函数,是Python网络编程这本书第七章的第一个例子。 # 这是供后边函数进行调用了,然后我们来进行研究网络的单线程编程,多线程编程、异步网络编程等。 # 导入网络编程socket、时间time、cmd参数获取模块 import argparse, socket, time # 定义一个字典用来存放发送给客户端的消息。 aphorisms = {b'Beautiful is better than?': b'Ugly.', b'Explicit is better than?': b'Implicit.', b'Simple is better than?': b'Complex.'} # 获取答案, 如果客户端发送了问题,就从上边的字典里边获取,如果没有的话就返回我不知道的错误。 def get_answer(aphorism): """Return the string response to a particular Zen-of-Python aphorism.""" time.sleep(0.0) # increase to simulate an expensive operation return aphorisms.get(aphorism, b'Error: unknown aphorism.') # 定义一个函数用来获取终端需要传入的参数。 host:主机IP或者名称 -p:端口,默认为1060 # 返回值是一个元祖,包含IP端口。 def parse_command_line(description): """Parse command line and return a socket address.""" parser = argparse.ArgumentParser(description=description) parser.add_argument('host', help='IP or hostname') parser.add_argument('-p', metavar='port', type=int, default=1060, help='TCP port (default 1060)') args = parser.parse_args() address = (args.host, args.p) return address # 创造一个socket套接字,这里的入参是上边那个函数的出参。 def create_srv_socket(address): """Build and return a listening server socket.""" # 创造一个套接字。 listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 设置。 listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 服务端绑定IP和端口。 listener.bind(address) # 设置服务端能够监听的数量,这里设置的是最大能够同时监听64个。 listener.listen(64) # 打印出绑定的IP端口,服务端绑定的。 print('Listening at {}'.format(address)) # 返回这个套接字。 return listener # 一直持续不断的进行监听, 观察有没有客户端和服务端进行连接。 # 这里的入参是上边函数的出参 def accept_connections_forever(listener): """Forever answer incoming connections on a listening socket.""" # 死循环 while True: # 服务端一直在监听端口,看有没有客户端进行连接。 # 这个是阻塞的,如果有的话那么才会进行下边的操作。 sock, address = listener.accept() # 打印出客户端IP端口 print('Accepted connection from {}'.format(address)) handle_conversation(sock, address) # 处理连接对话函数。 def handle_conversation(sock, address): """Converse with a client over `sock` until they are done talking.""" try: while True: # 这里一直处理客户端的请求。 handle_request(sock) # 接收异常,代表着客户端断开了连接。 except EOFError: print('Client socket to {} has closed'.format(address)) # 如果有其他错误,我们也需要进行接收下来。 except Exception as e: print('Client {} error: {}'.format(address, e)) # 最后关闭服务端的套接字。 finally: sock.close() # 处理请求函数。 def handle_request(sock): """Receive a single client request on `sock` and send the answer.""" # 这里我们调用函数进行接收客户端发送过来的消息。 aphorism = recv_until(sock, b'?') # 然后调用获取答案函数,将我们的答案回复给客户端。 answer = get_answer(aphorism) # 服务端进行发送消息 sock.sendall(answer) # 服务端和客户端进行连接后,一直进行接收客户端发送过来的消息,直到客户端发送了suffix # 这里我们的入参为?,如果客户端发送了suffix就代表着客户端发送完了消息。就需要进行关闭了。 def recv_until(sock, suffix): """Receive bytes over socket `sock` until we receive the `suffix`.""" # 接收数据, message = sock.recv(4096) # 如果数据为空。就抛出一个连接关闭的错误。 if not message: raise EOFError('socket closed') # 判断接收的消息最后是否是suffix,如果是地话,那我们就直接反悔了。 # 如果不是,就代表着客户端还有数据进行发送,服务端就需要继续进行接收。 while not message.endswith(suffix): # 能够进来while循环,就代表着客户端还有数据进行发送, # 那么我们需要继续进行接收 data = sock.recv(4096) # 如果客户端的数据为空。 # 再次抛出一个异常。 if not data: raise IOError('received {!r} then socket closed'.format(message)) message += data # 返回接收的数据。 return message 出处:https://www.cnblogs.com/cong12586/p/14071785.html
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数