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中使用glob和rmtree删除目录子目录及所有文件的例子
Nov 21 Python
python获取各操作系统硬件信息的方法
Jun 03 Python
在Python中通过threading模块定义和调用线程的方法
Jul 12 Python
利用Python实现图书超期提醒
Aug 02 Python
tf.truncated_normal与tf.random_normal的详细用法
Mar 05 Python
django 通过url实现简单的权限控制的例子
Aug 16 Python
Django 导出项目依赖库到 requirements.txt过程解析
Aug 23 Python
python hashlib加密实现代码
Oct 17 Python
Python telnet登陆功能实现代码
Apr 16 Python
opencv python 对指针仪表读数识别的两种方式
Jan 14 Python
python中操作文件的模块的方法总结
Feb 04 Python
Python数据清洗工具之Numpy的基本操作
Apr 22 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笔记之:AOP的应用
2013/04/24 PHP
PHP定时任务获取微信access_token的方法
2016/10/10 PHP
基于PHP-FPM进程池探秘
2017/10/17 PHP
Laravel 框架路由原理与路由访问实例分析
2020/04/14 PHP
Firefox getBoxObjectFor getBoundingClientRect联系
2008/10/26 Javascript
Javascript base64编码实现代码
2011/12/02 Javascript
JS控制图片翻转示例代码(兼容firefox,ie,chrome)
2013/12/19 Javascript
jquery链式操作的正确使用方法
2014/01/06 Javascript
使用javascript控制cookie显示和隐藏背景图
2014/02/12 Javascript
Ajax局部更新导致JS事件重复触发问题的解决方法
2014/10/14 Javascript
javascript中arguments,callee,caller详解
2016/03/16 Javascript
JS中常用的正则表达式
2016/09/29 Javascript
bootstrapValidator表单验证插件学习
2016/12/30 Javascript
NodeJS使用七牛云存储上传文件的方法
2017/07/24 NodeJs
vue项目中应用ueditor自定义上传按钮功能
2018/04/27 Javascript
在小程序开发中使用npm的方法
2018/10/17 Javascript
小程序实现左滑删除的效果的实例代码
2020/10/19 Javascript
JS实现页面侧边栏效果探究
2021/01/08 Javascript
python socket网络编程步骤详解(socket套接字使用)
2013/12/06 Python
Python实现控制台中的进度条功能代码
2017/12/22 Python
python模糊图片过滤的方法
2018/12/14 Python
详解opencv中画圆circle函数和椭圆ellipse函数
2019/12/27 Python
python学习之使用Matplotlib画实时的动态折线图的示例代码
2021/02/25 Python
HTML 5.1来了 9月份正式发布 更新内容预览
2016/04/26 HTML / CSS
StubHub新加坡:购买和出售全球活动门票
2017/03/10 全球购物
世界首屈一指的在线男士内衣权威:HisRoom
2017/08/05 全球购物
澳大利亚第一的设计师礼服租赁网站:GlamCorner
2017/08/13 全球购物
白俄罗斯女装和针织品网上商店:Presli.by
2019/10/13 全球购物
大学生就业自荐书
2014/06/16 职场文书
党的群众路线教育实践活动党员个人整改措施
2014/10/27 职场文书
2014年房地产工作总结范文
2014/11/19 职场文书
离婚答辩状怎么写
2015/05/22 职场文书
九年级化学教学反思
2016/02/22 职场文书
python中的装饰器该如何使用
2021/06/18 Python
Python办公自动化解决world文件批量转换
2021/09/15 Python
MySQL数据库事务的四大特性
2022/04/20 MySQL