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做出来的 ...
随机推荐
- 15.Git四种协议-本地协议(local)、HTTP协议、SSH协议、Git协议
1.本地协议(loacl) 最基本的协议,其远程仓库其实就是硬盘内部的一个目录(例如D:\\project).常见于团队内的人对一个共享的文件系统(例如NFS)具有访问权限,或者多人共用一台电脑的情况 ...
- 阿里云ecs自动创建快照教程
最近在一个博客联盟的微信群里面看到经常有朋友问阿里云的ecs服务器怎么设置自动创建快照,也不知道最近是怎么了,看到问这个问题的朋友有有四五个左右了,今天就特意到博客里来费大家分享设置自动创建快照的方法 ...
- C语言获取文件大小相关操作
C语言获取文件大小相关操作 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明 通常在希望从文件中把数据全都出来赋值给一个数组或者某一个指针,然后再进行相关 ...
- Andrew Ng机器学习课程11之贝叶斯统计和正则化
Andrew Ng机器学习课程11之贝叶斯统计和正则化 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 在统计学中有两个学派,一个是频率学派,另一个是贝叶斯学 ...
- 99%的人都理解错了GET与POST的区别
原文链接:https://mp.weixin.qq.com/s?__biz=MzI3NzIzMzg3Mw==&mid=100000054&idx=1&sn=71f6c214f3 ...
- subplot()一个窗口画多个图
import matplotlib.pyplot as plt plt.subplot(m,n,p) m,n表示一个窗口上显示m行n列 p表示正在处理第p个区域的部分(区域编号从左到右,从上到下) f ...
- 什么是H5?
总听到很多人说H5,现在H5很火,到底H5是什么,以下发表个人对H5的理解. HTML5 将成为 HTML.XHTML 以及 HTML DOM 的新标准. HTML 的上一个版本诞生于 1999 年. ...
- vue图片点击放大功能
因项目需求(ui框架element-ui),需要实现图片的点击放大,还要能旋转以及上下切换.当时第一反应,element-ui好像没有这样的组件,就想过自己写,但是那个旋转翻页上下切换感觉有点麻烦,不 ...
- 将 PDF 论文的公式截图后转成 Word 可编辑公式(23)
1. 问题 如何将PDF论文的公式截图后直接转成Word可编辑的公式? 2. 方法步骤 1.下载mathpix 2.使用mathpix截取公式,并生成LATEX 公式: 3.下载LaTeX转Word插 ...
- Django中常用的那些模块路径
Django中常用的那些模块路径 from django.shortcuts import HttpResponse, render, redirect from django import temp ...