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之类的细节
Oct 13 Python
Python StringIO模块实现在内存缓冲区中读写数据
Apr 08 Python
Python封装shell命令实例分析
May 05 Python
详解Django中的权限和组以及消息
Jul 23 Python
python函数的5种参数详解
Feb 24 Python
Python中动态检测编码chardet的使用教程
Jul 06 Python
Python3实现的回文数判断及罗马数字转整数算法示例
Mar 27 Python
python下的opencv画矩形和文字注释的实现方法
Jul 09 Python
python Gunicorn服务器使用方法详解
Jul 22 Python
python 工具 字符串转numpy浮点数组的实现
Mar 14 Python
python使用OpenCV模块实现图像的融合示例代码
Apr 10 Python
Python grpc超时机制代码示例
Sep 14 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
ThinkPHP之用户注册登录留言完整实例
2014/07/22 PHP
浅谈PHP中如何实现Hook机制
2017/11/14 PHP
ThinkPHP5.1的权限控制怎么写?分享一个AUTH权限控制
2021/03/09 PHP
jquery 取子节点及当前节点属性值
2014/07/25 Javascript
js中函数声明与函数表达式
2015/06/03 Javascript
微信小程序 自动登陆PHP源码实例(源码下载)
2017/05/08 Javascript
微信小程序tabbar不显示解决办法
2017/06/08 Javascript
node和vue实现商城用户地址模块
2018/12/05 Javascript
Vue源码中要const _toStr = Object.prototype.toString的原因分析
2018/12/09 Javascript
基于webpack4.X从零搭建React脚手架的方法步骤
2018/12/23 Javascript
jQuery判断自定义属性data-val用法示例
2019/01/07 jQuery
vue实现鼠标经过动画
2019/10/16 Javascript
jQuery开发仿QQ版音乐播放器
2020/07/10 jQuery
python实现计算倒数的方法
2015/07/11 Python
浅析Python中的for 循环
2016/06/09 Python
python机器学习理论与实战(五)支持向量机
2018/01/19 Python
值得收藏,Python 开发中的高级技巧
2018/11/23 Python
解决Python selenium get页面很慢时的问题
2019/01/30 Python
基于python实现把图片转换成素描
2019/11/13 Python
Python实现Word表格转成Excel表格的示例代码
2020/04/16 Python
PyPDF2读取PDF文件内容保存到本地TXT实例
2020/05/12 Python
python实现数据结构中双向循环链表操作的示例
2020/10/09 Python
Nike法国官方网站:Nike.com FR
2018/07/22 全球购物
Juicy Couture Beauty官方网站:香水和化妆品
2019/03/12 全球购物
以下的初始化有什么区别
2013/12/16 面试题
表扬信格式
2014/01/12 职场文书
购房协议书
2014/04/11 职场文书
机械设备与数控技术专业求职信
2014/08/10 职场文书
党旗在我心中演讲稿
2014/09/15 职场文书
敬业奉献模范事迹材料
2014/12/24 职场文书
水电工程师岗位职责
2015/02/13 职场文书
六一晚会主持词开场白
2015/05/28 职场文书
活动简报范文
2015/07/22 职场文书
nginx 多个location转发任意请求或访问静态资源文件的实现
2021/03/31 Servers
HTML+JS实现在线朗读器
2022/02/15 Javascript
浅谈Python中对象是如何被调用的
2022/04/06 Python