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做出来的 ...
随机推荐
- 从源码角度解析Netty的React模式是如何工作的
Netty 支持多种实现方式,比如nio,epoll 等,本文以nio的实现方式进行讲解. 1.EventLoop : 事件循环看,简单来说就是一个死循环监听事件,如果事件来了,处理掉.通常做法就是开 ...
- VS2010开发.cpp与.c的注意事项
VS2010开发.cpp与.c的注意事项 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 强大的VS2010,正是由于vs2010的完全封装,让现在的wind ...
- Loaded plugins: fastestmirror, refresh-packagekit, security
问题描述 最近在用Centos 6.7的时候出现了这种情况 Loaded plugins: fastestmirror, refresh-packagekit, security Loading mi ...
- Asp.Net Core集成Swagger
工作中一个公司会有很多个项目,项目之间的交互经常需要编写 API 来实现,但是编写文档是一件繁琐耗时的工作,并且随着 API 的迭代,每次都需要去更新维护接口文档,很多时候由于忘记或者人员交替的愿意造 ...
- 基于.Net Standard开发的微信服务端开源库
一直想做一个开源库, 为社区贡献一份力量, 同时提高一下自己 一年来在给公司做一款微信小程序, 于是突发奇想用.Net Standard做一整套微信开发服务端类库 地址: https://gitee. ...
- 【51nod】1407 与与与与
[51nod]1407 与与与与 设\(f(x)\) 为\(A_{i} \& x == x\)的\(A_{i}\)的个数 设\(g(x)\)为\(x\)里1的个数 \(\sum_{i = 0} ...
- 【坑】springMvc 信息校验,读取不到错误配置信息的问题
文章目录 前言 ResourceBundleMessageSource 后记 前言 springMvc 的一大利器,validation 检验,通过注解,可以帮我们完成校验,很是顺手. 终极偷懒检验, ...
- Linux (x86) Exploit 开发系列教程之二(整数溢出)
(1)漏洞代码 //vuln.c #include <stdio.h> #include <string.h> #include <stdlib.h> void s ...
- java中如何测试一段代码的运行时间
一.以毫秒为单位.long startTime = System.currentTimeMillis(); //获取开始时间 doSomething(); //测试的代码段 long endTime ...
- Scratch-介绍“克隆”
上次我们模仿一个扔小球的运动, 用到了Scratch的“克隆”. 用Scratch模仿扔小球 “克隆”命令 Scratch“克隆”有三个命令积木. 区分“本体”和“克隆体” 使用“克隆”命令, 我们发 ...