计算机网络(4): socket select使用:聊天室模版
知识点:

如上所示,用户首先将需要进行IO操作的socket添加到select中,然后阻塞等待select系统调用返回。当数据到达时,socket被激活,select函数返回。用户线程正式发起read请求,读取数据并继续执行。
从流程上来看,使用select函数进行IO请求和同步阻塞模型没有太大的区别,甚至还多了添加监视socket,以及调用select函数的额外操作,效率更差。但是,使用select以后最大的优势是用户可以在一个线程内同时处理多个socket的IO请求。用户可以注册多个socket,然后不断地调用select读取被激活的socket,即可达到在同一个线程内同时处理多个IO请求的目的。而在同步阻塞模型中,必须通过多线程的方式才能达到这个目的。
使用:
readable, writable, exceptional = select.select(inputs, outputs, inputs)
第一个参数是我们需要监听可读的套接字, 第二个参数是我们需要监听可写的套接字, 第三个参数使我们需要监听异常的套接字, 第四个则是时间限制设置.
如果监听的套接字满足了可读可写条件, 那么所返回的can,read 或是 can_write就会有值了, 然后我们就可以利用这些返回值进行随后的操作了。相比较unix 的select模型, 其select函数的返回值是一个整型, 用以判断是否执行成功
案例:
1)服务器
import socket,select # Function to broadcast chat messages to all connected clients
def broadcast_data(sock, message):
# Do not send the message to master socket and the client who has send us the message
for socket in CONNECTION_LIST:
if socket != server_socket and socket != sock:
try:
socket.send(message)
except:
# broken socket connection may be, chat client pressed ctrl+c for example
socket.close()
CONNECTION_LIST.remove(socket) if __name__ == "__main__": # List to keep track of socket descriptors
CONNECTION_LIST = []
RECV_BUFFER = 4096 # Advisable to keep it as an exponent of 2
PORT = 22 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# this has no effect, why ?
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(("0.0.0.0", PORT))
server_socket.listen(10) # Add server socket to the list of readable connections
CONNECTION_LIST.append(server_socket) print("Chat server started on port " + str(PORT)) while 1:
# Get the list sockets which are ready to be read through select
read_sockets, write_sockets, error_sockets = select.select(CONNECTION_LIST, [], []) for sock in read_sockets:
# New connection
if sock == server_socket:
# Handle the case in which there is a new connection recieved through server_socket
sockfd, addr = server_socket.accept()
CONNECTION_LIST.append(sockfd)
print("Client (%s, %s) connected" % (addr,sockfd)) #*****这里修改了服务器********
broadcast_data(sockfd,("[%s:%s] entered room\n" % (addr,sockfd)).encode('utf-8')) # Some incoming message from a client
else:
# Data recieved from client, process it
try:
# In Windows, sometimes when a TCP program closes abruptly,
# a "Connection reset by peer" exception will be thrown
data = sock.recv(RECV_BUFFER)
if not data or data.decode('utf-8') == 'exit':
server_socket.close() if data:
broadcast_data(sock, ("\r" + '<' + str(sock.getpeername()) + '> ' + data.decode('utf-8')).encode('utf-8'))
broadcast_data(sock,data) except:
broadcast_data(sock, ("Client is offline").encode('utf-8'))
print("Client is offline")
sock.close()
CONNECTION_LIST.remove(sock)
continue
2)客户端
# telnet program example
import socket, select, string, sys # def prompt():
# sys.stdout.write('<You> ')
# sys.stdout.flush() # main function
if __name__ == "__main__": if (len(sys.argv) < 3):
print('Usage : python telnet.py hostname port')
sys.exit() host = sys.argv[1]
port = int(sys.argv[2]) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(2) # connect to remote host
try:
s.connect((host, port))
except:
print('Unable to connect')
sys.exit() print('Connected to remote host. Start sending messages') while 1:
rlist = [sys.stdin, s] # Get the list sockets which are readable
read_list, write_list, error_list = select.select(rlist, [], []) for sock in read_list:
# incoming message from remote server
if sock == s:
data = sock.recv(4096)
if not data:
print('\nDisconnected from chat server')
sys.exit()
else:
# print data
data = data.decode("utf-8")
sys.stdout.write(data)
print(len(data)) break
https://www.cnblogs.com/zhiyong-ITNote/p/7553694.html
https://blog.csdn.net/weixin_41010318/article/details/80257177
计算机网络(4): socket select使用:聊天室模版的更多相关文章
- C#基于Socket的简单聊天室实践
序:实现一个基于Socket的简易的聊天室,实现的思路如下: 程序的结构:多个客户端+一个服务端,客户端都是向服务端发送消息,然后服务端转发给所有的客户端,这样形成一个简单的聊天室功能. 实现的细节: ...
- 【总结】学习Socket编写的聊天室小程序
1.前言 在学习Socket之前,先来学习点网络相关的知识吧,自己学习过程中的一些总结,Socket是一门很高深的学问,本文只是Socket一些最基础的东西,大神请自觉绕路. 传输协议 TCP:Tra ...
- 使用socket.io搭建聊天室
最近在学习nodejs,需要找一些项目练练手.找来找去发现了一个聊天室的教程,足够简单,也能从中学到一些东西.下面记录我练习过程中待一些笔记. nodeJS模块 共用到了2个模块,express和so ...
- node.js + socket.io实现聊天室一
前段时间,公司打算在社区做一个聊天室.决定让我来做.本小白第一次做聊天类功能,当时还想着通过ajax请求来实现.经过经理提示,说试试当前流行的node.js 和socket.io来做.于是就上网学习研 ...
- Socket.io在线聊天室
从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎.chrome浏 ...
- 【C++】基于socket的多线程聊天室(控制台版)
以前学习socket网络编程和多线程编程的时候写的一个练手程序 聊天室基本功能: 1.用户管理:登录,注册,登出,修改用户名,修改密码 2.聊天室功能:群聊,私聊,获取在线用户列表,获取所有用户列表 ...
- Socket.io官方聊天室DEMO的学习笔记
照着Socket.io官方的聊天室代码敲了一遍,遇到了一个奇怪的问题: 每次点击SEND按钮的时候,都会重新刷新页面. 在点击页面的一瞬间,看到了正在加载jquery的提示, 然后以为是jquery用 ...
- 使用 Socket.IO 开发聊天室
前言 Socket.IO 是一个用来实现实时双向通信的框架,其本质是基于 WebSocket 技术. 我们首先来聊聊 WebSocket 技术,先设想这么一个场景: · 用户小A,打开了某个网站的充值 ...
- Socket实现简易聊天室,Client,Server
package seday08; import java.io.BufferedWriter;import java.io.OutputStream;import java.io.OutputStre ...
随机推荐
- C++Socket通信(客户端和服务器)
win32控制台版 获取本机IP: cmd: ipconfig/all 我写的是一个服务器和客户端点对点的信息传递(实现相互的可以适当更改代码): 服务器发送给客户端的是一个结构体数据 t ...
- 通过request获得全路径
<% String test = request.getScheme()+"://"+request.getServerName()+":"+reque ...
- jvm 性能监控与linux常用命令
linux日常的运维 .Java开发 管理监控命令 ,较为浅显,欢迎提意见,我将在后面持续补充.
- POJ 3615 Cow Hurdles(最短路径flyod)
Cow Hurdles Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9337 Accepted: 4058 Descr ...
- com.alibaba.druid.pool.DruidDataSource
https://www.cnblogs.com/wuyun-blog/p/5679073.html DRUID介绍 DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PR ...
- Ubuntu 安装phpmyadmin (9.17第六天)
PhpMyAdmin 是一个用 PHP 编写的软件工具,可以通过 web方式控制和操作 MySQL 数据库.通过 phpMyAdmin 可以完全对数据库进行操作,例如建立.复制和删除数据等等,这样 M ...
- # vim ~/.vimrc vim配色
Ubuntu # vim ~/.vimrc # /hom/zzx 下 set nomodeline "(这个一定要写,目前有这个安全漏洞) set ...
- OC Swift混编-Swift.h File not found
https://www.jianshu.com/p/f860fe1718ca 2016.09.13 11:53* 字数 266 阅读 1935评论 1喜欢 1 今天碰到个神坑,本人项目是OC项目,最近 ...
- URAL_1146/uva_108 最大子矩阵 DP 降维
题意很简单,给定一个N*N的大矩阵,求其中数值和最大的子矩阵. 一开始找不到怎么DP,没有最优子结构啊,后来聪哥给了我思路,化成一维,变成最大连续和即可.为了转化成一维,必须枚举子矩阵的宽度,通过预处 ...
- 2020PHP面试-SQL篇
一.乐观锁和悲观锁 1.悲观锁是指假设并发更新会发生冲突,不管冲突是否会发生,都会使用锁机制. 优点: 完全保证数据安全. 缺点:锁机制会有额外开销,并发度降低. 可能会产生死锁. 2. 乐观锁是指假 ...