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的Bottle框架中获取制定cookie的教程
Apr 24 Python
Python实现建立SSH连接的方法
Jun 03 Python
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
Apr 23 Python
python图片验证码生成代码
Jul 02 Python
深入理解Django中内置的用户认证
Oct 06 Python
Python爬取十篇新闻统计TF-IDF
Jan 03 Python
python读文件保存到字典,修改字典并写入新文件的实例
Apr 23 Python
python使用xlrd和xlwt读写Excel文件的实例代码
Sep 05 Python
python3.7 使用pymssql往sqlserver插入数据的方法
Jul 08 Python
pycharm全局搜索的具体步骤
Jul 28 Python
Python requests上传文件实现步骤
Sep 15 Python
在vscode中启动conda虚拟环境的思路详解
Dec 25 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注释实例技巧
2008/10/03 PHP
不要轻信 PHP_SELF的安全问题
2009/09/05 PHP
并发下常见的加锁及锁的PHP具体实现代码
2010/10/12 PHP
十个PHP高级应用技巧果断收藏
2015/09/25 PHP
Mootools 1.2教程 设置和获取样式表属性
2009/09/15 Javascript
JavaScript中textRange对象使用方法小结
2015/03/24 Javascript
js创建对象的方法汇总
2016/01/07 Javascript
总结jQuery插件开发中的一些要点
2016/05/16 Javascript
基于vue实现分页/翻页组件paginator示例
2017/03/09 Javascript
vue修改vue项目运行端口号的方法
2017/08/04 Javascript
React教程之封装一个Portal可复用组件的方法
2018/01/02 Javascript
vue+axios 前端实现登录拦截的两种方式(路由拦截、http拦截)
2018/10/24 Javascript
JS浮点数运算结果不精确的Bug解决
2019/08/01 Javascript
Vue自定义指令结合阿里云OSS优化图片的实现方法
2019/11/12 Javascript
js实现点击烟花特效
2020/10/14 Javascript
Vue中强制组件重新渲染的正确方法
2021/01/03 Vue.js
[59:44]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 paiN vs iG
2018/03/31 DOTA
Python时间戳与时间字符串互相转换实例代码
2013/11/28 Python
Python的ORM框架SQLObject入门实例
2014/04/28 Python
详解Python中的join()函数的用法
2015/04/07 Python
在Mac OS上使用mod_wsgi连接Python与Apache服务器
2015/12/24 Python
Python基于分水岭算法解决走迷宫游戏示例
2017/09/26 Python
python os.listdir按文件存取时间顺序列出目录的实例
2018/10/21 Python
在python中只选取列表中某一纵列的方法
2018/11/28 Python
PyTorch实现AlexNet示例
2020/01/14 Python
Python中Selenium库使用教程详解
2020/07/23 Python
python 基于selenium实现鼠标拖拽功能
2020/12/24 Python
实例教程 HTML5 Canvas 超炫酷烟花绽放动画实现代码
2014/11/05 HTML / CSS
Foot Locker英国官网:美国知名运动产品零售商
2019/02/21 全球购物
简述数组与指针的区别
2014/01/02 面试题
What's the difference between Debug and Trace class? (Debug类与Trace类有什么区别)
2013/09/10 面试题
面试后感谢信怎么写
2014/02/01 职场文书
《自选商场》教学反思
2014/02/14 职场文书
美术课外活动总结
2014/07/08 职场文书
个人更名证明
2015/06/23 职场文书
python3实现无权最短路径的方法
2021/05/12 Python