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 相关文章推荐
深入理解 Python 中的多线程 新手必看
Nov 20 Python
python用装饰器自动注册Tornado路由详解
Feb 14 Python
20个常用Python运维库和模块
Feb 12 Python
python opencv旋转图像(保持图像不被裁减)
Jul 26 Python
Django forms组件的使用教程
Oct 08 Python
用Django写天气预报查询网站
Oct 21 Python
使用python采集脚本之家电子书资源并自动下载到本地的实例脚本
Oct 23 Python
一文秒懂python读写csv xml json文件各种骚操作
Jul 04 Python
简单分析python的类变量、实例变量
Aug 23 Python
Python的几种主动结束程序方式
Nov 22 Python
Python日志syslog使用原理详解
Feb 18 Python
MoviePy简介及Python视频剪辑自动化
Dec 18 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
Linux下将excel数据导入到mssql数据库中的方法
2010/02/08 PHP
PHP字符串比较函数strcmp()和strcasecmp()使用总结
2014/11/19 PHP
jquery 模拟雅虎首页的点击对话框效果
2010/04/11 Javascript
javascript中的事件代理初探
2014/03/08 Javascript
thinkphp 表名 大小写 窍门
2015/02/01 Javascript
jQuery解析XML与传统JavaScript方法的差别实例分析
2015/03/05 Javascript
js实现滚动条滚动到页面底部继续加载
2015/12/19 Javascript
JavaScript位移运算符(无符号) &gt;&gt;&gt; 三个大于号 的使用方法详解
2016/03/31 Javascript
js仿微信公众平台打标签功能
2017/04/08 Javascript
JS表格组件神器bootstrap table使用指南详解
2017/04/12 Javascript
jQuery使用JSONP实现跨域获取数据的三种方法详解
2017/05/04 jQuery
JavaScript实现小球沿正弦曲线运动
2020/09/07 Javascript
vue前后分离调起微信支付
2019/07/29 Javascript
微信小程序获取用户信息及手机号(后端TP5.0)
2019/09/12 Javascript
vue+webpack 更换主题N种方案优劣分析
2019/10/28 Javascript
JS call()及apply()方法使用实例汇总
2020/07/11 Javascript
Element中Slider滑块的具体使用
2020/07/29 Javascript
UEditor 自定义图片视频尺寸校验功能的实现代码
2020/10/20 Javascript
Python数据结构之Array用法实例
2014/10/09 Python
详解python函数传参是传值还是传引用
2018/01/16 Python
使用pandas实现csv/excel sheet互相转换的方法
2018/12/10 Python
python 遍历列表提取下标和值的实例
2018/12/25 Python
python如何给字典的键对应的值为字典项的字典赋值
2019/07/05 Python
python里反向传播算法详解
2020/11/22 Python
Python项目打包成二进制的方法
2020/12/30 Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
2021/02/24 Python
德国汉莎航空中国官网: Lufthansa中国
2017/03/30 全球购物
俄罗斯美容和健康网上商店:Созвездие Красоты
2019/07/23 全球购物
static函数与普通函数有什么区别
2015/12/25 面试题
最新创业融资计划书
2014/01/19 职场文书
退伍老兵事迹材料
2014/01/31 职场文书
关于母亲节的感言
2014/02/04 职场文书
护理中职生求职信范文
2014/02/24 职场文书
运动会口号8字
2014/06/07 职场文书
css常用字体属性与背景属性介绍
2022/02/28 HTML / CSS
详解Python flask的前后端交互
2022/03/31 Python