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中暂存上传图片的方法
Feb 18 Python
Python使用gensim计算文档相似性
Apr 10 Python
Python松散正则表达式用法分析
Apr 29 Python
python版本坑:md5例子(python2与python3中md5区别)
Jun 20 Python
Python字符串格式化的方法(两种)
Sep 19 Python
python中map()函数的使用方法示例
Sep 29 Python
Python中的默认参数实例分析
Jan 29 Python
Python3实现的字典遍历操作详解
Apr 18 Python
Python3实现从排序数组中删除重复项算法分析
Apr 03 Python
python实现文件助手中查看微信撤回消息
Apr 29 Python
利用Python的turtle库绘制玫瑰教程
Nov 23 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
Jul 05 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实现长连接的方法与注意事项的问题
2013/05/10 PHP
基于PHP实现等比压缩图片大小
2016/03/04 PHP
php+flash+jQuery多图片上传源码分享
2020/07/27 PHP
[原创]PHP获取数组表示的路径方法分析【数组转字符串】
2017/09/01 PHP
javascript动态改变img的src属性图片不显示的解决方法
2010/10/20 Javascript
表单元素的submit()方法和onsubmit事件应用概述
2013/02/01 Javascript
JS加jquery简单实现标签元素的显示或隐藏
2013/09/23 Javascript
JS滚轮事件onmousewheel使用介绍
2013/11/01 Javascript
JS控制一个DIV层在指定时间内消失的方法
2014/02/17 Javascript
jQuery的ready方法详解
2014/11/27 Javascript
jqueryUI里拖拽排序示例分析
2015/02/26 Javascript
jQuery实时显示鼠标指针位置和键盘ASCII码
2016/03/28 Javascript
jQuery遍历DOM节点操作之filter()方法详解
2016/04/14 Javascript
jQuery、zepto、js常用小技巧
2017/02/12 Javascript
Bootstrap table使用方法汇总
2017/11/17 Javascript
VueJs监听window.resize方法示例
2018/01/17 Javascript
JavaScript异步加载问题总结
2018/02/17 Javascript
详解如何使用babel进行es6文件的编译
2018/05/29 Javascript
详解React之key的使用和实践
2018/09/29 Javascript
微信小程序实现禁止分享代码实例
2019/10/19 Javascript
js实现烟花特效
2020/03/02 Javascript
electron踩坑之remote of undefined的解决
2020/10/06 Javascript
vue+vant 上传图片需要注意的地方
2021/01/03 Vue.js
[52:02]完美世界DOTA2联赛PWL S2 FTD.C vs SZ 第一场 11.27
2020/11/30 DOTA
使用python实现正则匹配检索远端FTP目录下的文件
2015/03/25 Python
Python中map和列表推导效率比较实例分析
2015/06/17 Python
使用Python实现博客上进行自动翻页
2017/08/23 Python
python编程羊车门问题代码示例
2017/10/25 Python
python实现三次样条插值
2018/12/17 Python
使用 tf.nn.dynamic_rnn 展开时间维度方式
2020/01/21 Python
Django数据结果集序列化并展示实现过程
2020/04/22 Python
HTML5为输入框添加语音输入功能的实现方法
2017/02/06 HTML / CSS
Grow Gorgeous美国官网:只要八天,体验唤醒毛囊后新生的茂密秀发
2018/06/04 全球购物
德国在线购买葡萄酒网站:Geile Weine
2019/09/24 全球购物
中学教师自我鉴定
2014/02/07 职场文书
文员岗位职责
2015/02/04 职场文书