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编写检测数据库SA用户的方法
Jul 11 Python
python中元类用法实例
Oct 10 Python
python获取当前日期和时间的方法
Apr 30 Python
python 实现在Excel末尾增加新行
May 02 Python
python2.x实现人民币转大写人民币
Jun 20 Python
Python识别快递条形码及Tesseract-OCR使用详解
Jul 15 Python
python查找重复图片并删除(图片去重)
Jul 16 Python
Python进阶之迭代器与迭代器切片教程
Jan 29 Python
用什么库写 Python 命令行程序(示例代码详解)
Feb 20 Python
Python接收手机短信的代码整理
Aug 02 Python
Python尾递归优化实现代码及原理详解
Oct 09 Python
python opencv角点检测连线功能的实现代码
Nov 24 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
PHP中危险的file_put_contents函数详解
2017/11/04 PHP
php把字符串指定字符分割成数组的方法
2018/03/12 PHP
PHP7 安装event扩展的实现方法
2019/10/08 PHP
Javascript技术技巧大全(五)
2007/01/22 Javascript
大家未必知道的Js技巧收藏
2008/04/07 Javascript
javascript  Error 对象 错误处理
2008/05/18 Javascript
百度 popup.js 完美修正版非常的不错 脚本之家推荐
2009/04/17 Javascript
关于COOKIE个数与大小的问题
2011/01/17 Javascript
Js点击弹出下拉菜单效果实例
2013/08/12 Javascript
判断客户浏览器是否支持cookie的示例代码
2013/12/23 Javascript
jQuery实现点击该行即可删除HTML表格行
2014/10/17 Javascript
JS实现让访问者自助选择网页文字颜色的方法
2015/02/24 Javascript
jQuery实现垂直半透明手风琴特效代码分享
2015/08/21 Javascript
javascript实现移动端上的触屏拖拽功能
2016/03/04 Javascript
jQuery实现响应鼠标事件的图片透明效果【附demo源码下载】
2016/06/16 Javascript
快速移动鼠标触发问题及解决方法(ECharts外部调用保存为图片操作及工作流接线mouseenter和mouseleave)
2016/08/29 Javascript
JavaScript中浅讲ajax图文详解
2016/11/11 Javascript
详细分析JS函数去抖和节流
2017/12/05 Javascript
vue路由前进后退动画效果的实现代码
2018/12/10 Javascript
vue使用vuex实现首页导航切换不同路由的方法
2019/05/08 Javascript
vue data恢复初始化数据的实现方法
2019/10/31 Javascript
工作中常用js功能汇总
2020/11/07 Javascript
Python numpy实现数组合并实例(vstack,hstack)
2018/01/09 Python
酷! 程序员用Python带你玩转冲顶大会
2018/01/17 Python
实例介绍Python中整型
2019/02/11 Python
对Python的多进程锁的使用方法详解
2019/02/18 Python
Python算法的时间复杂度和空间复杂度(实例解析)
2019/11/19 Python
解决Jupyter NoteBook输出的图表太小看不清问题
2020/04/16 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
2020/06/15 Python
python 模块导入问题汇总
2021/02/01 Python
Python绘制词云图之可视化神器pyecharts的方法
2021/02/23 Python
pycharm Tab键设置成4个空格的操作
2021/02/26 Python
html5自定义video标签的海报与播放按钮功能
2019/12/04 HTML / CSS
宣传工作经验材料
2014/06/02 职场文书
食品安全宣传标语
2014/06/07 职场文书
2014年乡镇个人工作总结
2014/12/03 职场文书