在Linux系统中

01 阻塞服务端

特征:1对1,阻塞。
 import socket

 server = socket.socket()        #生成套接字对象
server.bind(('0.0.0.0', 8000)) #套接字绑定ip和端口,变为监听套接字
server.listen(5) #开始监听 while True:
conn, addr = server.accept() #建立连接,生成对等套接字
print('用户连接:', addr)
while True:
try:
data = conn.recv(1024)
if data == b'Q' or data == b'q':
print('用户退出:', addr)
break
else:
print('收到的消息:', data.decode())
conn.send(data)
except Exception as e:
print(e)
conn.close()
break

02 非阻塞服务端

特征:1对多,轮询,非阻塞,占用资源多。
 import socket

 server = socket.socket()        #创建套接字
server.setblocking(False) #把套接字设置为非阻塞
server.bind(('0.0.0.0', 8001)) #绑定IP和端口
server.listen(5) #监听端口 all_connection = [] #保存已经连接的客户
while True:
#只管连接的事情
try:
conn, addr = server.accept() # 建立连接,没有就抛出异常
conn.setblocking(False) #设置非阻塞
print('用户连接:', addr)
all_connection.append(conn)
except Exception as e:
pass #处理已经连接用户的消息
handle = all_connection.copy() #完全拷贝了列表
for connection in handle:
try:
recv_data = connection.recv(1024)
if recv_data:
print(recv_data.decode())
connection.send(recv_data)
else: #客户端消息处理完了,已经断开了连接
print('断开连接', connection)
connection.close()
all_connection.remove(connection) #从客户列表里移除断开连接的客户
except Exception as e:
pass

03 epoll服务端

特征:1对多,通知机制,非阻塞,占用资源少;
epoll:注册惰性事件回调。
 import selectors #调用epoll的模块
import socket epoll = selectors.EpollSelector() #生成一个epoll
server = socket.socket() #生成套接字
server.bind(('', 8082))  #参数1‘’与‘0.0.0.0’等价,表示ip都可接入
server.listen(100) #回调函数
def create_conneciton(server):
#百分百有人连接,不会阻塞
conn, addres = server.accept() #生成对等连接套接字 #处理消息的函数注册
epoll.register(conn, selectors.EVENT_READ, read_data)
return conn #回调函数 处理消息
def read_data(conn): data = conn.recv(1024)
if data:
print(data)
conn.send(data)
else:
epoll.unregister(conn) #删掉注册事件 #
#把监听套接字和生成对等套接字的函数注册到read事件(有用户连接)
epoll.register(server, selectors.EVENT_READ, create_conneciton) #
while True:      #事件循环
events = epoll.select() #去操作系统查询 for key,mask in events:
sock = key.fileobj #连接客户端的套接字
callback = key.data #回调函数 #read_data(conn), create_conneciton(server)
callback(sock) #调用函数

04 客户端

测试服务端。
 import socket

 client = socket.socket()
client.connect(('127.0.0.1', 8082)) while True:
data = input('输入数据:')
client.send(data.encode())
recv_data = client.recv(1024)
print(recv_data.decode())

最新文章

  1. com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 解决办法
  2. .NET 平台下的插件化开发内核(Rabbit Kernel)
  3. Javascript中call和apply的区别与详解
  4. Linux删除文件后空间没有释放
  5. 关于sublime text的配置方法
  6. Eclipse 安装反编译插件jadclipse(经验总结)
  7. 初涉JavaScript模式 (3) : 字面量
  8. excel使用cube
  9. 【转载】Windows系统下删除ubuntu
  10. Navicat连接oracle数据出现的oci问题
  11. 解决jequry使用keydown无法跳转的问题
  12. Person Re-ID行人重试别梳理
  13. 【Dubbo 源码解析】02_Dubbo SPI
  14. ElasticSearch文档操作介绍三
  15. js图的数据结构处理----邻链表,广度优先搜索,最小路径,深度优先搜索,探索时间拓扑
  16. 将Python项目打包成EXE可执行文件(单文件,多文件,包含图片)
  17. javascript prototype学习
  18. (解释文)My SQL中主键为0和主键自排约束的关系
  19. 记遇到的一个php坑
  20. PowerBuilder连接数据库

热门文章

  1. docker 系列 - 修改容器的 DNS 服务器
  2. ASP.NET MVC 4 笔记
  3. luogu 2480 古代猪文 数论合集(CRT+Lucas+qpow+逆元)
  4. 【小玩意】time-passing-by clock
  5. Codeforces 1043F(容斥+dp)
  6. Spark思维导图之性能优化
  7. python中前后端通信方法Ajax和ORM映射(form表单提交)
  8. jq的stop
  9. Django REST Framework API Guide 03
  10. Codeforces Round #545 (Div. 2)(B. Circus)