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 实现一个类似简单聊天室的功能(多客户端互相通信)的更多相关文章

  1. 利用socket.io+nodejs打造简单聊天室

    代码地址如下:http://www.demodashi.com/demo/11579.html 界面展示: 首先展示demo的结果界面,只是简单消息的发送和接收,包括发送文字和发送图片. ws说明: ...

  2. Python Socket 简单聊天室2

    上篇文章写了一个简单的单线程的一问一答的简单聊天室.这次我们使用SocketServer模块搭建一个多线程异步的聊天室. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...

  3. 基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍。最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室。

    基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍.最后我们将会实现一个基于S ...

  4. 与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室

    原文:与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...

  5. 与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室

    原文:与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...

  6. 学习WebSocket(二):使用Spring WebSocket做一个简单聊天室

    聊天室高频率.低延时完全符合websocket的特点,所以聊天室使用websocket再适合不过了. 聊天室的功能并没有比上一节代码多多少,主要在握手阶段对用户的session做处理,对用户的消息进行 ...

  7. SpringBoot 搭建简单聊天室

    SpringBoot 搭建简单聊天室(queue 点对点) 1.引用 SpringBoot 搭建 WebSocket 链接 https://www.cnblogs.com/yi1036943655/p ...

  8. IO、NIO实现简单聊天室,附带问题解析

      本篇文章主要使用IO和NIO的形式来实现一个简单的聊天室,并且说明IO方法存在的问题,而NIO又是如何解决的.   大概的框架为,先提供思路和大概框架图--代码--问题及解决方式,这样会容易看一点 ...

  9. Asp.Net SignalR - 简单聊天室实现

    简单聊天室 使用持久链接类我们就可以做一些即时通讯的应用了,我使用Group做了一个简单的聊天室,先上图技术细节下面再讲 可以加入聊天室.创建聊天室.发送消息,下面就说说我是如何通过Group做出来的 ...

随机推荐

  1. 【miscellaneous】基于gstreamer的实时转码

    目标是实现一个实时转码,可用于IPTV提供节目源.相关工作在ubuntu操作系统下进行.需要对源代码进行修改的时候,直接采用apt-get source命令获取源代码,根据需要进行修改,然后安装,这样 ...

  2. 关于远程链接 redis的坑·

    今天遇到了一个问题,在redis.conf 中 将 bind: 注释掉bind 127.0.0.1 仍然不行 其实是要把bind 127.0.0.1 改为 0.0.0.0 才行 下面附赠详细过程 查看 ...

  3. rest_framework之组件大长今

    功能导入快捷查询: from rest_framework import serializers # 序列化from rest_framework.routers import SimpleRoute ...

  4. Noip2013(普及组) 车站分级

    题目描述 一条单向的铁路线上,依次有编号为 , , …, n 的 n 个火车站.每个火车站都有一个级别,最低为 级.现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车站 x, ...

  5. PCL学习(三) SAC-IA 估记object pose

    SAC-IA是基于RANSAC算法的对齐算法 通过降采样提高法向计算.FPFH特征的计算 最后通过SAC-IA计算得到对齐的旋转和平移 #include <Eigen/Core> #inc ...

  6. sqlite 版本更新维护, 表结构判断, 更新

    sqlite会自动维护一个系统表sqlite_master,该表存储了我们所创建的各个table, view, trigger等等信息. sqlite_master表数据字段: type: 类型,取值 ...

  7. VC++实现遍历指定文件夹

    VC++实现遍历指定文件夹,并进行深度遍历,一级,二级...最终列出该文件夹下所有文件全路径. #include "stdafx.h" #include <iostream& ...

  8. Spring (1)框架

    Spring第一天笔记   1. 说在前面 怎样的架构的程序,我们认为是一个优秀的架构? 我们考虑的标准:可维护性好,可扩展性好,性能. 什么叫可扩展性好? 答:就是可以做到,不断的增加代码,但是可以 ...

  9. SVN迁移到Gitlab实践经历

    svn 迁移至git操作手册 项目交付.版本管理工具变更等情况下,迁移svn旧历史记录有很大必要,方便后续追踪文件的提交历史,文件修改记录比对等.git自带了从svn迁移至git的工具命令,可很好的对 ...

  10. kettle工具的介绍和使用

    kettle详解(数据抽取.转换.装载) 原文地址链接:https://blog.csdn.net/qq_35731570/article/details/71123413   一:下载路径 当你要学 ...