python监听网络请求_Python实现一个服务器监听多个客户端请求
学习Python网络通信的时候发现书上只有一个服务端对应一个客户端的情形,于是自己想自己动手实现一个服务端响应多个客户端。
首先建立服务器的socket来监听客户端的请求:
tcpSerSock=socket(AF_INET,SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)
这样服务器的监听socket就建好了。
接下来的思路是,如果要监听多个客户端,则
tcpSerSock.accept() #(accept()是阻塞式的)
必须放进一个while循环(不放进循环监听一次就没了)。然而,这里就有问题了。如果按照一对一的那种处理顺序,客户端A连进来后,程序顺序向下执行,服务端要再写一个while循环,用来处理客户端A的请求,如果此时客户端B再来请求,服务器将接收不到。于是,很自然想到,将监听和处理放到不同的线程进行处理。我选择将监听放入主线程,将处理放进子线程。该服务器功能为接收到客户端的数据加上时间戳后返回给客户端。服务端完整代码如下:
#coding=utf-8
#!/usr/bin/env python
'''''
author:Mr.Jing
created on Fri Sep 22 14:29:03 2017
platfrom:win10,python2.7
'''
from socket import *
from time import ctime
import threading
import time
HOST=''
PORT=2159
BUFSIZ=1024
ADDR = (HOST,PORT)
tcpSerSock=socket(AF_INET,SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)
socks=[] #放每个客户端的socket
def handle():
while True:
for s in socks:
data = s.recv(BUFSIZ)
if not data:
socks.remove(s)
continue
s.send('[%s],%s' % (ctime(), data)) #加上时间戳返回
t = threading.Thread(target=handle) #子线程
if __name__ == '__main__':
t.start()
print u'我在%s线程中 ' % threading.current_thread().name #本身是主线程
print 'waiting for connecting...'
while True:
clientSock,addr = tcpSerSock.accept()
print 'connected from:', addr
socks.append(clientSock)
两个客户端A和B同时连接,服务器输出:
可以看到服务端是可以相应多个客户端的。
客户端A发条消息试试?
服务器返回来了带时间戳的消息,goodjob。
那另一个呢?
很棒。服务器都能做出响应。
再发一条试试?
发现服务器没响应了,这是怎么回事呢?
经过仔细勘察发现是因为这句:
data = s.recv(BUFSIZ)
因为recv方法是阻塞的,也就是说,当轮训到某个客户端,比如A,这句等待A发消息,不发消息就不往下走,所以此时B再去发消息的话服务器就收不到了。
那该怎么办呢?
很容易想到,将其设为非阻塞就好了。但上网找了好久,虽然找到可以用setblocking(0) 将套接字设为非阻塞,然而具体怎么用却很少有人讲清楚。查资料后终于搞明白,非阻塞的recv方法会继续向下执行,若超时得不到数据则会抛出异常。
修改后的代码如下:
#coding=utf-8
#!/usr/bin/env python
'''''
author:Mr.Jing
created on Fri Sep 22 14:29:03 2017
platfrom:win10,python2.7
'''
from socket import *
from time import ctime
import threading
import time
HOST=''
PORT=2159
BUFSIZ=1024
ADDR = (HOST,PORT)
tcpSerSock=socket(AF_INET,SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)
socks=[] #放每个客户端的socket
def handle():
while True:
for s in socks:
try:
data = s.recv(BUFSIZ) #到这里程序继续向下执行
except Exception, e:
continue
if not data:
socks.remove(s)
continue
s.send('[%s],%s' % (ctime(), data))
t = threading.Thread(target=handle) #子线程
if __name__ == '__main__':
t.start()
print u'我在%s线程中 ' % threading.current_thread().name #本身是主线程
print 'waiting for connecting...'
while True:
clientSock,addr = tcpSerSock.accept()
print 'connected from:', addr
clientSock.setblocking(0)
socks.append(clientSock)
此时再去尝试:
客户端随便输都会得到响应。任务达成!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
python监听网络请求_Python实现一个服务器监听多个客户端请求相关推荐
- python制作qq登录界面_Python制作一个仿QQ办公版的图形登录界面
最近,QQ的办公版本--TIM进行了一次更新升级.本次更新升级大幅修改了界面的样式,看起来更加的清爽.简洁和高效了. 这种界面州的先生还是比较喜欢的,没有QQ那么花里胡哨,也比微信那些残缺的功能更加丰 ...
- python抓取网络摄像头_python实现从本地摄像头和网络摄像头截取图片功能
python-----从本地摄像头和网络摄像头截取图片 ,具体代码如下所示: import cv2 # 获取本地摄像头 # folder_path 截取图片的存储目录 def get_img_from ...
- python编写的网络摄像头_python实现从本地摄像头和网络摄像头截取图片功能
python-----从本地摄像头和网络摄像头截取图片 ,具体代码如下所示: import cv2 # 获取本地摄像头 # folder_path 截取图片的存储目录 def get_img_from ...
- python学习(九) 网络编程学习--简易网站服务器
python `网络编程`和其他语言都是一样的,服务器这块步骤为: `1. 创建套接字` `2. 绑定地址` `3. 监听该描述符的所有请求` `4. 有新的请求到了调用accept处理请求` Pyt ...
- python监听鼠标事件_Python中使用PyHook监听鼠标和键盘事件实例
Python 中使用 PyHook 监听鼠标和键盘事件实例 PyHook 是一个基于 Python 的"钩子"库,主要用于监 听当前电脑上鼠标和键盘的事件.这个库依赖于另一个 Py ...
- python如何提取网络链接_Python网络爬虫——把一个网页中所有的链接地址提取出来(去重)...
# 把一个网页中所有的链接地址提取出来. 运行环境Python3.6.4-实现代码:import urllib.request import re #1. 确定好要爬取的入口链接 url = &quo ...
- python初学者之网络爬虫_Python初学者之网络爬虫(二)
到目前为止我新做了如下事情: 对MySql的读写操作进行了封装 编码风格遵从PEP8 爬取沃米优选网(http://video.51wom.com/)的主播信息 爬取一下网(http://www.yi ...
- python实现火车票查询工具_Python 实现一个火车票查询的工具
原标题:Python 实现一个火车票查询的工具 作者 sexycoder 本文转载自简书,转载需授权 使用 python 实现一个查询火车票的小工具 主要功能: 输入出发车站,到达车站,时间,然后返回 ...
- Python搭建UDP网络通信模型,制作一个简单的私人聊天器~
互联网的本质是什么? 其实就是信息的交换. 就比如我们常用的QQ.微信等. 那么如何将自己的信息发送到其他人的电脑上呢? 那就需要借助网络模型来完成这样的事情了. 今天就带领大家使用UDP网络模型来完 ...
- python杀死线程的方法_python杀死一个线程的方法
由于python线程没有提供abort方法,所以我们需要自己想办法解决此问题,面对这一问题,小编帮大家解决phthon杀死一个线程的方法 最近在项目中遇到这一需求: 我需要一个函数工作,比如远程连接一 ...
最新文章
- 今日头条女程序员加班加到不来大姨妈,凌晨十二点半回家的她竟然还被老板吐槽不投入!妹子抑郁大哭!...
- struts上传文件 血案
- kuka机器人外部轴异步_(技术)机器人维保10个常见问题解答
- 解决iOS地图持续定位耗电问题
- hbase官方网站声称的兼容是否是100%兼容?
- Java线程start()vs run()方法及示例
- 调节Win7系统任务栏预览窗口大小的方法
- android 怎么刷机,android系统怎么刷机
- Spring jndi连接数据库
- 开源自研新基建,内核实践云数据,当此方为嘉年华 - 2020嘉年华大会侧记
- 外媒称三星已对苹果折叠屏订单进行采样
- 从零开始学前端:定位 --- 今天你学习了吗?(CSS:Day17)
- java quickfix_QuickFix Java 讲解(三)客户端的搭建与解析
- 共享代码库,为何总被程序员弃用?
- 日常邮件用语(一)网摘学习
- 十八、x86汇编基础
- todo elk搭建日志系统
- codesmith执行时提示“调用的目标发生了异常”的处理过程经验。
- Atitit.木马病毒的操作注册表原理 系统服务管理器 atiSysService
- 2019最新版Eclipse下载与安装