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 open读写文件实现脚本
Sep 06 Python
python访问纯真IP数据库的代码
May 19 Python
跟老齐学Python之print详解
Sep 28 Python
Python中列表、字典、元组数据结构的简单学习笔记
Mar 20 Python
python 定时修改数据库的示例代码
Apr 08 Python
解决PyCharm的Python.exe已经停止工作的问题
Nov 29 Python
PyQt5实现暗黑风格的计时器
Jul 29 Python
vscode 配置 python3开发环境的方法
Sep 19 Python
python 实现绘制整齐的表格
Nov 18 Python
pycharm 2018 激活码及破解补丁激活方式
Sep 21 Python
详解anaconda离线安装pytorchGPU版
Sep 08 Python
python help函数实例用法
Dec 06 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数据结构与算法(PHP描述) 查找与二分法查找
2012/06/21 PHP
php反射应用示例
2014/02/25 PHP
ThinkPHP中URL路径访问与模块控制器之间的关系
2014/08/23 PHP
PHP下载文件的函数实例代码
2016/05/18 PHP
laravel 出现command not found问题的解决方案
2019/10/23 PHP
用倒置滤镜把div倒置,再把table倒置。
2007/07/31 Javascript
IE/FireFox具备兼容性的拖动代码
2007/08/13 Javascript
input 和 textarea 输入框最大文字限制的jquery插件
2011/10/27 Javascript
jQuery 淡出一个图像到另一个图像的实现代码
2013/06/12 Javascript
javascript获取form里的表单元素的示例代码
2014/02/14 Javascript
JQuery调用WebServices的方法和4个实例
2014/05/06 Javascript
Jquery判断radio、selelct、checkbox是否选中及获取选中值方法总结
2015/04/15 Javascript
js实现滑动触屏事件监听的方法
2015/05/05 Javascript
jquery实现通用的内容渐显Tab选项卡效果
2015/09/07 Javascript
基于JavaScript实现图片点击弹出窗口而不是保存
2016/02/06 Javascript
nodejs后台集成ueditor富文本编辑器的实例
2017/07/11 NodeJs
AngularJS select设置默认值的实现方法
2017/08/25 Javascript
小程序如何定位所在城市及发起周边搜索
2020/02/11 Javascript
vue实现五子棋游戏
2020/05/28 Javascript
实现vuex原理的示例
2020/10/21 Javascript
vue-video-player视频播放器使用配置详解
2020/10/23 Javascript
[01:19:34]2014 DOTA2国际邀请赛中国区预选赛 New Element VS Dream time
2014/05/22 DOTA
[00:03]DOTA2新版本PA至宝展示
2014/11/19 DOTA
python smtplib模块实现发送邮件带附件sendmail
2018/05/22 Python
对django后台admin下拉框进行过滤的实例
2019/07/26 Python
python的命名规则知识点总结
2019/10/04 Python
python编写计算器功能
2019/10/25 Python
使用Python的Turtle库绘制森林的实例
2019/12/18 Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
2020/11/01 Python
Ubuntu16安装Python3.9的实现步骤
2020/12/15 Python
在IE6系列等老式浏览器中使用HTML5的新标签实现方案
2012/12/25 HTML / CSS
业务部经理岗位职责
2014/01/04 职场文书
机械设备与数控技术专业求职信
2014/08/10 职场文书
护士年终个人总结
2015/02/13 职场文书
只用20行Python代码实现屏幕录制功能
2021/06/02 Python
Python办公自动化解决world文件批量转换
2021/09/15 Python