socket 实现一个类似简单聊天室的功能(多客户端互相通信)
server端:
#coding=utf-8
'''
一个广播程序,linux运行
'''
import select,socket import traceback def broadcast(conn,message):
for i in conn_list:
if i!=sk and i!=conn:
try:
i.send(message.encode())
except:
conn.close()
conn_list.remove(i) if __name__=='__main__':
conn_list=[]
buffer_size=4096 sk=socket.socket()
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
sk.bind(('127.0.0.1',9789))
sk.listen(5)
conn_list.append(sk)
print('Chat server started on port 9789') while 1:
print('while wai: mission list:',conn_list)
read_sock,write_sock,error_sock=select.select(conn_list,[],[])
for i in read_sock:
print('for mission list:',conn_list)
if i==sk:
conn,addr=sk.accept()
conn_list.append(conn)
print('client (%s,%s) connected'%addr) print('socket server broadcast now!')
broadcast(conn,'(%s,%s) entered room '%addr) else:
try:
data=i.recv(4096) #buffer_size if data:
print('recv data:',data.decode())
print('received from conn broadcast2 now!')
broadcast(i,'from client %s:'%str(i.getpeername())+data.decode()+'\n') elif data.strip()=='' or data.strip()=='bye':
print('client %s close!'%str(i.getpeername()))
i.close()
conn_list.remove(i)
break
else:
print('client %s close!'%str(i.getpeername()))
i.close()
conn_list.remove(i)
break except:
traceback.print_exc()
print('%s is offline!'%str(i.getpeername()))
i.close()
conn_list.remove(i)
#continue
break
sk.close()
client端:
#coding=utf-8
'''
client
''' import socket,select,string,sys def prompt():
#sys.stdout.write('<You>')
#sys.stdout.flush()
print('<You>') if __name__=='__main__':
'''
if len(sys.argv)<3:
print('参数错误!')
sys.exit() host=sys.argv[1]
port=int(sys.argv[2])
''' sk=socket.socket()
try:
#sk.connect((host,port))
sk.connect(('127.0.0.1',9789))
except:
print('unable to connect')
sys.exit() print('connected success,send message')
prompt() while 1:
ll=[sys.stdin,sk]
read_l,write_l,error=select.select(ll,[],[]) for i in read_l:
if i==sk:
data=sk.recv(4096)
if not data:
pass else:
sys.stdout.write(data.decode())
prompt()
else:
msg=sys.stdin.readline()
if not (msg.strip()=='' or msg.strip()=='bye'):
sk.send(msg.encode())
prompt()
else:
sk.close()
ll.clear()
break
if len(ll)==0:
break
sys.exit()
socket 实现一个类似简单聊天室的功能(多客户端互相通信)的更多相关文章
- 利用socket.io+nodejs打造简单聊天室
代码地址如下:http://www.demodashi.com/demo/11579.html 界面展示: 首先展示demo的结果界面,只是简单消息的发送和接收,包括发送文字和发送图片. ws说明: ...
- Python Socket 简单聊天室2
上篇文章写了一个简单的单线程的一问一答的简单聊天室.这次我们使用SocketServer模块搭建一个多线程异步的聊天室. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...
- 基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍。最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室。
基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍.最后我们将会实现一个基于S ...
- 与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室
原文:与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...
- 与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室
原文:与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...
- 学习WebSocket(二):使用Spring WebSocket做一个简单聊天室
聊天室高频率.低延时完全符合websocket的特点,所以聊天室使用websocket再适合不过了. 聊天室的功能并没有比上一节代码多多少,主要在握手阶段对用户的session做处理,对用户的消息进行 ...
- SpringBoot 搭建简单聊天室
SpringBoot 搭建简单聊天室(queue 点对点) 1.引用 SpringBoot 搭建 WebSocket 链接 https://www.cnblogs.com/yi1036943655/p ...
- IO、NIO实现简单聊天室,附带问题解析
本篇文章主要使用IO和NIO的形式来实现一个简单的聊天室,并且说明IO方法存在的问题,而NIO又是如何解决的. 大概的框架为,先提供思路和大概框架图--代码--问题及解决方式,这样会容易看一点 ...
- Asp.Net SignalR - 简单聊天室实现
简单聊天室 使用持久链接类我们就可以做一些即时通讯的应用了,我使用Group做了一个简单的聊天室,先上图技术细节下面再讲 可以加入聊天室.创建聊天室.发送消息,下面就说说我是如何通过Group做出来的 ...
随机推荐
- charles 验证工具
本文参考:charles 验证工具 验证工具/validate 验证工具 Charles可以通过发送到W3C HTML验证器,W3C CSS验证器和W3C Feed验证器来验证记录的响应. 验证报告在 ...
- 2.app自动化测试--adb常用API
adb常用API Driver.current_activity 获取当前运行应用界面的启动名 Driver.current_package 获取当前运行应用的包名 Driver.contexts ...
- godot新手教程1[button信号使用]<godot节点信号对照及节点属性用法>
button(按钮)节点信号对照: 1:pressed() #按钮点击信号 #绑定按钮点击后触发信号 Pressed使用案例: func _on_”节点路径”_Button_pressed( ...
- MATLAB知识-解决因缺少libsvm 而运行出现Y must be a vector or a character array.
matlab版本R2014b 最近运行一个使用svmtrain的程序,出现以下错误: 这是因为是在设定路径里面没有libsvm.辛亏有一位师姐的电脑里面有libsvm的包,我直接用了,这样就不需要下载 ...
- springboot使用activemq同时接收queue和topic消息
原文链接:https://blog.csdn.net/jia_costa/article/details/79354478 新建springboot项目, pom文件如下 <?xml versi ...
- 点击 显示红色 小案例 vue
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- [CF37D]Lesson Timetable_动态规划
Lesson Timetable 题目链接:https://www.codeforces.com/contest/37/problem/D 数据范围:略. 题解: 根本就没想到可以动态规划. 首先从前 ...
- win10系统不能ping通vmware虚假机解决办法
在使用vmware安装虚拟机后,在虚拟机里面可以上网,但就是不能在宿主机通过远程连接工具连接 同时也不能ping通虚拟机 检查网络配置 查看网关 在宿主机打开 ip地址填写刚刚查看的网关,同时把子网掩 ...
- MySQL 新建用户,为用户授权,指定用户访问数据库
1.登录MySQL mysql -u root -p 2.添加新用户(允许所有ip访问) create user 'test'@'*' identified by '123456';(test:用户名 ...
- python学习-23 函数
函数 1.函数分为:数学定义的函数和编程语言中的函数 例如: - 数学定义的函数:y=2*x+1 - 编程语言的函数: def test(x): x += 1 return x def :定义函数的 ...