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的Django框架部署的一些建议
Apr 09 Python
Python如何实现守护进程的方法示例
Feb 08 Python
Django 2.0版本的新特性抢先看!
Jan 05 Python
答题辅助python代码实现
Jan 16 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
Apr 22 Python
python pandas中对Series数据进行轴向连接的实例
Jun 08 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
Jun 28 Python
Python简单处理坐标排序问题示例
Jul 11 Python
Python简易版停车管理系统
Aug 12 Python
使用keras时input_shape的维度表示问题说明
Jun 29 Python
python中threading和queue库实现多线程编程
Feb 06 Python
详解python日志输出使用配置文件格式
Feb 10 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
Zend Guard一些常见问题解答
2008/09/11 PHP
php遍历目录viewDir函数
2009/12/15 PHP
php判断输入不超过mysql的varchar字段的长度范围
2011/06/24 PHP
PHP常量使用的几个需要注意的地方(谨慎使用PHP中的常量)
2014/09/12 PHP
[原创]php求圆周率的简单实现方法
2016/05/30 PHP
PHP图形计数器程序显示网站用户浏览量
2016/07/20 PHP
PHP实现大数(浮点数)取余的方法
2017/02/18 PHP
PHP绕过open_basedir限制操作文件的方法
2018/06/10 PHP
JS IE和FF兼容性问题汇总
2009/02/09 Javascript
javascript 面向对象编程 聊聊对象的事
2009/09/17 Javascript
对setInterval在火狐和chrome切换标签产生奇怪的效果之探索,与解决方案!
2011/10/29 Javascript
提交表单时执行func方法实现代码
2013/03/17 Javascript
js判断当前浏览器类型,判断IE浏览器方法
2014/06/02 Javascript
javascript将异步校验表单改写为同步表单
2015/01/27 Javascript
jQuery使用$.ajax提交表单完整实例
2015/12/11 Javascript
使用jQuery判断Div是否在可视区域的方法 判断div是否可见
2016/02/17 Javascript
基于JavaScript实现复选框的全选和取消全选
2017/02/09 Javascript
利用babel将es6语法转es5的简单示例
2017/12/01 Javascript
js实现动态改变radio状态的方法
2018/02/28 Javascript
vue实现跨域的方法分析
2019/05/21 Javascript
[01:06]DOTA2亚洲邀请赛专属珍藏-荧煌之礼
2017/03/24 DOTA
利用Opencv中Houghline方法实现直线检测
2018/02/11 Python
Python实现的个人所得税计算器示例
2018/06/01 Python
Python 读取串口数据,动态绘图的示例
2019/07/02 Python
python命令行工具Click快速掌握
2019/07/04 Python
为什么从Python 3.6开始字典有序并效率更高
2019/07/15 Python
PYTHON实现SIGN签名的过程解析
2019/10/28 Python
python实现查找所有程序的安装信息
2020/02/18 Python
纯css3实现思维导图样式示例
2018/11/01 HTML / CSS
美国生日蛋糕店:Bake Me A Wish!
2017/02/08 全球购物
信息专业大学生自我评价分享
2014/01/17 职场文书
关于感恩的演讲稿200字
2014/08/26 职场文书
抗洪救灾标语
2014/10/08 职场文书
2016年幼儿园万圣节活动总结
2016/04/05 职场文书
详解Vue的options
2021/05/15 Vue.js
MySQL为数据表建立索引的原则详解
2022/03/03 MySQL