学习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实现一个服务器监听多个客户端请求相关推荐

  1. python制作qq登录界面_Python制作一个仿QQ办公版的图形登录界面

    最近,QQ的办公版本--TIM进行了一次更新升级.本次更新升级大幅修改了界面的样式,看起来更加的清爽.简洁和高效了. 这种界面州的先生还是比较喜欢的,没有QQ那么花里胡哨,也比微信那些残缺的功能更加丰 ...

  2. python抓取网络摄像头_python实现从本地摄像头和网络摄像头截取图片功能

    python-----从本地摄像头和网络摄像头截取图片 ,具体代码如下所示: import cv2 # 获取本地摄像头 # folder_path 截取图片的存储目录 def get_img_from ...

  3. python编写的网络摄像头_python实现从本地摄像头和网络摄像头截取图片功能

    python-----从本地摄像头和网络摄像头截取图片 ,具体代码如下所示: import cv2 # 获取本地摄像头 # folder_path 截取图片的存储目录 def get_img_from ...

  4. python学习(九) 网络编程学习--简易网站服务器

    python `网络编程`和其他语言都是一样的,服务器这块步骤为: `1. 创建套接字` `2. 绑定地址` `3. 监听该描述符的所有请求` `4. 有新的请求到了调用accept处理请求` Pyt ...

  5. python监听鼠标事件_Python中使用PyHook监听鼠标和键盘事件实例

    Python 中使用 PyHook 监听鼠标和键盘事件实例 PyHook 是一个基于 Python 的"钩子"库,主要用于监 听当前电脑上鼠标和键盘的事件.这个库依赖于另一个 Py ...

  6. python如何提取网络链接_Python网络爬虫——把一个网页中所有的链接地址提取出来(去重)...

    # 把一个网页中所有的链接地址提取出来. 运行环境Python3.6.4-实现代码:import urllib.request import re #1. 确定好要爬取的入口链接 url = &quo ...

  7. python初学者之网络爬虫_Python初学者之网络爬虫(二)

    到目前为止我新做了如下事情: 对MySql的读写操作进行了封装 编码风格遵从PEP8 爬取沃米优选网(http://video.51wom.com/)的主播信息 爬取一下网(http://www.yi ...

  8. python实现火车票查询工具_Python 实现一个火车票查询的工具

    原标题:Python 实现一个火车票查询的工具 作者 sexycoder 本文转载自简书,转载需授权 使用 python 实现一个查询火车票的小工具 主要功能: 输入出发车站,到达车站,时间,然后返回 ...

  9. Python搭建UDP网络通信模型,制作一个简单的私人聊天器~

    互联网的本质是什么? 其实就是信息的交换. 就比如我们常用的QQ.微信等. 那么如何将自己的信息发送到其他人的电脑上呢? 那就需要借助网络模型来完成这样的事情了. 今天就带领大家使用UDP网络模型来完 ...

  10. python杀死线程的方法_python杀死一个线程的方法

    由于python线程没有提供abort方法,所以我们需要自己想办法解决此问题,面对这一问题,小编帮大家解决phthon杀死一个线程的方法 最近在项目中遇到这一需求: 我需要一个函数工作,比如远程连接一 ...

最新文章

  1. 今日头条女程序员加班加到不来大姨妈,凌晨十二点半回家的她竟然还被老板吐槽不投入!妹子抑郁大哭!...
  2. struts上传文件 血案
  3. kuka机器人外部轴异步_(技术)机器人维保10个常见问题解答
  4. 解决iOS地图持续定位耗电问题
  5. hbase官方网站声称的兼容是否是100%兼容?
  6. Java线程start()vs run()方法及示例
  7. 调节Win7系统任务栏预览窗口大小的方法
  8. android 怎么刷机,android系统怎么刷机
  9. Spring jndi连接数据库
  10. 开源自研新基建,内核实践云数据,当此方为嘉年华 - 2020嘉年华大会侧记
  11. 外媒称三星已对苹果折叠屏订单进行采样
  12. 从零开始学前端:定位 --- 今天你学习了吗?(CSS:Day17)
  13. java quickfix_QuickFix Java 讲解(三)客户端的搭建与解析
  14. 共享代码库,为何总被程序员弃用?
  15. 日常邮件用语(一)网摘学习
  16. 十八、x86汇编基础
  17. todo elk搭建日志系统
  18. codesmith执行时提示“调用的目标发生了异常”的处理过程经验。
  19. Atitit.木马病毒的操作注册表原理 系统服务管理器 atiSysService
  20. 2019最新版Eclipse下载与安装

热门文章

  1. get和post用法和区别总结
  2. Polkit授权管理
  3. 移动智能终端PIN码破解
  4. html主题标签是什么意思,HTML5所有标签汇总及标签意义解释
  5. LeetCode 分割整数数组,分割为两部分的和相等
  6. pentaho的使用与感受
  7. 拼多多回应漏洞:比薅羊毛更快的是“资损200亿”谣言的传播速度
  8. PS系列之 -- 用通道抠图
  9. DM数据库实例迁移教程
  10. 文件服务器 磁盘配额,文件服务器磁盘配额管理.doc