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 相关文章推荐
10款最好的Web开发的 Python 框架
Mar 18 Python
python 多线程重启方法
Feb 18 Python
Python的log日志功能及设置方法
Jul 11 Python
pytorch索引查找 index_select的例子
Aug 18 Python
pywinauto自动化操作记事本
Aug 26 Python
python修改FTP服务器上的文件名
Sep 11 Python
Python List列表对象内置方法实例详解
Oct 22 Python
python  ceiling divide 除法向上取整(或小数向上取整)的实例
Dec 27 Python
使用OpenCV校准鱼眼镜头的方法
Nov 26 Python
详解pycharm自动import所需的库的操作方法
Nov 30 Python
golang中的空接口使用详解
Mar 30 Python
如何在pycharm中快捷安装pip命令(如pygame)
May 31 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图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
2010/12/02 PHP
用php的ob_start来生成静态页面的方法分析
2011/03/09 PHP
清华大学出版的事半功倍系列 javascript全部源代码
2007/05/04 Javascript
Mootools 1.2教程 正则表达式
2009/09/15 Javascript
js模拟点击事件实现代码
2012/11/06 Javascript
jquery组件使用中遇到的问题整理及解决
2014/02/21 Javascript
js自动查找select下拉的菜单并选择(示例代码)
2014/02/26 Javascript
深入分析JSONP跨域的原理
2014/12/10 Javascript
JS模拟的Map类实现方法
2016/06/17 Javascript
javascript鼠标滑过显示二级菜单特效
2020/11/18 Javascript
Boostrap实现的登录界面实例代码
2016/10/09 Javascript
AngularJS中$injector、$rootScope和$scope的概念和关联关系深入分析
2017/01/19 Javascript
jQuery实现文章图片弹出放大效果
2017/04/06 jQuery
jQuery zTree树插件动态加载实例代码
2017/05/11 jQuery
基于 jQuery 实现键盘事件监听控件
2019/04/04 jQuery
vue 路由子组件created和mounted不起作用的解决方法
2019/11/05 Javascript
微信小程序实现抖音播放效果的实例代码
2020/04/11 Javascript
jQuery实现tab栏切换效果
2020/12/22 jQuery
[01:06]DOTA2小知识课堂 Ep.01 TP出门不要忘记帮队友灌瓶哦
2019/12/05 DOTA
python3图片转换二进制存入mysql
2013/12/06 Python
下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决
2018/04/23 Python
PyCharm代码提示忽略大小写设置方法
2018/10/28 Python
tensorflow 自定义损失函数示例代码
2020/02/05 Python
python字符串判断密码强弱
2020/03/18 Python
如何基于线程池提升request模块效率
2020/04/18 Python
ffmpeg+Python实现B站MP4格式音频与视频的合并示例代码
2020/10/21 Python
CSS3制作气泡对话框的实例教程
2016/05/10 HTML / CSS
美国快时尚彩妆品牌:Winky Lux(透明花瓣润唇膏)
2018/11/06 全球购物
大学生学习2014年全国两会心得体会
2014/03/12 职场文书
《长城和运河》教学反思
2014/04/14 职场文书
大三学年自我鉴定范文(3篇)
2014/09/28 职场文书
小学秋季运动会报道稿
2014/09/30 职场文书
2015年先进个人自荐书
2015/03/24 职场文书
关于做家务的心得体会
2016/01/23 职场文书
MySQL中的隐藏列的具体查看
2021/09/04 MySQL
Javascript使用integrity属性进行安全验证
2021/11/07 Javascript