Python socket C/S结构的聊天室应用实现


Posted in Python onNovember 30, 2014

Python socket C/S结构的聊天室应用

服务端:

#!/usr/bin/env python
#coding:utf8
 
import socket,select
def broadcast_data (sock,message):
 for socket in conn_list:
  if socket != server_socket and socket != sock :
   try :
    socket.send(message)
   except :
    socket.close()
    conn_list.remove(socket)
 
if __name__ == "__main__":
 conn_list = []
 recv_buffer = 4096
 PORT = 9999
 
 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #端口重用,可选
 server_socket.bind(('', PORT))
 server_socket.listen(99)
 
 conn_list.append(server_socket)
 
 print "Chat server started on port " + str(PORT)
 
 while 1:
  read_sockets,write_sockets,error_sockets = select.select(conn_list,[],[])
  for sock in read_sockets:
   #新建连接
   if sock == server_socket:
    sockfd, addr = server_socket.accept()
    conn_list.append(sockfd)
    print "Client (%s, %s) connected" % addr
    broadcast_data(sockfd, "[%s:%s] entered room\n" % addr)
   #进入聊天室
   else:
    try:
     data = sock.recv(recv_buffer)
     if data:
      broadcast_data(sock, "\r" + '<' + str(sock.getpeername()) + '> ' + data)
    except:
     broadcast_data(sock, "Client (%s, %s) is offline" % addr)
     print "Client (%s, %s) is offline" % addr
     sock.close()
     conn_list.remove(sock)
     continue
 
 server_socket.close()

客户端:

#!/usr/bin/env python
#coding:utf8
import socket,select,string,sys
 
def prompt() :
 sys.stdout.write('<You> ')
 sys.stdout.flush()
 
if __name__ == "__main__":
 
 if(len(sys.argv) < 3) :
  print 'Usage : python chat_client.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)
 
 try :
  s.connect((HOST, PORT))
 except :
  print 'Unable to connect'
  sys.exit()
 
 print 'Connected to remote host. Start sending messages'
 prompt()
 
 while 1:
  socket_list = [sys.stdin, s]
 
  read_sockets, write_sockets, error_sockets = select.select(socket_list , [], [])
 
  for sock in read_sockets:
   if sock == s:
    data = sock.recv(4096)
    if not data :
     print '\nDisconnected from chat server'
     sys.exit()
    else :
     sys.stdout.write(data)
     prompt()
 
   else :
    msg = sys.stdin.readline()
    s.send(msg)
    prompt()
Python 相关文章推荐
在Django的通用视图中处理Context的方法
Jul 21 Python
全面了解Python环境配置及项目建立
Jun 30 Python
Python利用Beautiful Soup模块修改内容方法示例
Mar 27 Python
Python编程修改MP3文件名称的方法
Apr 19 Python
Python中对象的引用与复制代码示例
Dec 04 Python
python爬虫之xpath的基本使用详解
Apr 18 Python
Python绘制堆叠柱状图的实例
Jul 09 Python
python3 写一个WAV音频文件播放器的代码
Sep 27 Python
Python网页解析器使用实例详解
May 30 Python
使用Python项目生成所有依赖包的清单方式
Jul 13 Python
详解python metaclass(元类)
Aug 13 Python
pandas 按日期范围筛选数据的实现
Feb 20 Python
Python open()文件处理使用介绍
Nov 30 #Python
Python fileinput模块使用介绍
Nov 30 #Python
Python 列表list使用介绍
Nov 30 #Python
Python 字典dict使用介绍
Nov 30 #Python
Python 序列化 pickle/cPickle模块使用介绍
Nov 30 #Python
Linux下Python获取IP地址的代码
Nov 30 #Python
Python re模块介绍
Nov 30 #Python
You might like
Symfony生成二维码的方法
2016/02/04 PHP
PHP SFTP实现上传下载功能
2017/07/26 PHP
php ajax confirm 删除实例详解
2019/03/06 PHP
在Laravel5中正确设置文件权限的方法
2019/05/22 PHP
图片格式的JavaScript和CSS速查手册
2007/08/20 Javascript
JavaScript实现的in_array函数
2014/08/27 Javascript
jQuery插件datepicker 日期连续选择
2015/06/12 Javascript
js仿黑客帝国字母掉落效果代码分享
2020/11/08 Javascript
微信小程序教程之本地图片上传(leancloud)实例详解
2016/11/16 Javascript
JavaScript微信定位功能实现方法
2016/11/29 Javascript
jQuery Easyui加载表格出错时在表格中间显示自定义的提示内容
2016/12/08 Javascript
angularjs中ng-bind-html的用法总结
2017/05/23 Javascript
详解使用vue实现tab 切换操作
2017/07/03 Javascript
ES6扩展运算符的用途实例详解
2017/08/20 Javascript
vue-cli3.0实现一个多页面应用的历奇经历记录总结
2020/03/16 Javascript
jQuery实现简单QQ聊天框
2020/08/27 jQuery
PYTHON正则表达式 re模块使用说明
2011/05/19 Python
python TCP Socket的粘包和分包的处理详解
2018/02/09 Python
python 每天如何定时启动爬虫任务(实现方法分享)
2018/05/21 Python
Python读取csv文件分隔符设置方法
2019/01/14 Python
python 比较2张图片的相似度的方法示例
2019/12/18 Python
ipython jupyter notebook中显示图像和数学公式实例
2020/04/15 Python
Keras预训练的ImageNet模型实现分类操作
2020/07/07 Python
一些关于python 装饰器的个人理解
2020/08/31 Python
PyCharm 2020.2下配置Anaconda环境的方法步骤
2020/09/23 Python
CPB肌肤之钥美国官网:Clé de Peau Beauté
2017/09/05 全球购物
网页设计个人找工作求职信
2013/11/28 职场文书
初中生期末考试的自我评价
2013/12/17 职场文书
晚会主持词开场白
2014/03/17 职场文书
团日活动总结书
2014/05/08 职场文书
2014年幼儿园教研工作总结
2014/12/04 职场文书
2016年乡镇综治宣传月活动总结
2016/03/16 职场文书
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
2021/04/27 Python
Redis缓存-序列化对象存储乱码问题的解决
2021/06/21 Redis
Java数据开发辅助工具Docker与普通程序使用方法
2021/09/15 Java/Android
为什么RedisCluster设计成16384个槽
2021/09/25 Redis