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 splitlines使用技巧
Sep 06 Python
pycharm 使用心得(五)断点调试
Jun 06 Python
在Python的Django框架中编写错误提示页面
Jul 22 Python
Python配置mysql的教程(推荐)
Oct 13 Python
如何用python整理附件
May 13 Python
Python爬虫 bilibili视频弹幕提取过程详解
Jul 31 Python
Python values()与itervalues()的用法详解
Nov 27 Python
python ssh 执行shell命令的示例
Sep 29 Python
使用Python Tkinter实现剪刀石头布小游戏功能
Oct 23 Python
python爬虫智能翻页批量下载文件的实例详解
Feb 02 Python
Python带你从浅入深探究Tuple(基础篇)
May 15 Python
python面向对象版学生信息管理系统
Jun 24 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输出控制功能在简繁体转换中的应用
2006/10/09 PHP
php开启openssl的方法
2014/05/15 PHP
33道php常见面试题及答案
2015/07/06 PHP
Laravel 数据库加密及数据库表前缀配置方法
2019/10/10 PHP
Laravel5.5 数据库迁移:创建表与修改表示例
2019/10/23 PHP
用htc组件制作windows选项卡
2007/01/13 Javascript
nodejs教程 安装express及配置app.js文件的详细步骤
2013/05/11 NodeJs
JQuery.Ajax之错误调试帮助信息介绍
2013/07/04 Javascript
JavaScript算法系列之快速排序(Quicksort)算法实例详解
2016/09/04 Javascript
bootstrap suggest搜索建议插件使用详解
2017/03/25 Javascript
基于Jquery Ajax type的4种类型(详解)
2017/08/02 jQuery
JS中实现隐藏部分姓名或者电话号码的代码
2018/07/17 Javascript
解决vue中post方式提交数据后台无法接收的问题
2018/08/11 Javascript
js canvas实现橡皮擦效果
2018/12/20 Javascript
移动端(微信等使用vConsole调试console的方法
2019/03/05 Javascript
详解jQuery-each()方法
2019/03/13 jQuery
JavaScript遍历查找数组中最大值与最小值的方法示例
2019/05/24 Javascript
layer.prompt使文本框为空的情况下也能点击确定的方法
2019/09/24 Javascript
python paramiko实现ssh远程访问的方法
2013/12/03 Python
Python深入学习之对象的属性
2014/08/31 Python
python中正则表达式的使用详解
2014/10/17 Python
浅析Python多线程下的变量问题
2015/04/28 Python
Python线程池模块ThreadPoolExecutor用法分析
2018/12/28 Python
python实现翻转棋游戏(othello)
2019/07/29 Python
python 爬虫爬取京东ps4售卖情况
2020/12/18 Python
台湾最大银发乐活百货:乐龄网
2018/05/21 全球购物
印度尼西亚电子产品购物网站:Kliknklik
2018/06/05 全球购物
商务英语专业应届毕业生求职信
2013/10/28 职场文书
英语四级考试作弊检讨书
2014/09/29 职场文书
领导班子对照检查剖析材料
2014/10/13 职场文书
青年岗位能手事迹材料
2014/12/23 职场文书
国庆阅兵观后感
2015/06/15 职场文书
2015年小学师德师风建设工作总结
2015/10/23 职场文书
2019公司管理制度
2019/04/19 职场文书
mysql外连接与内连接查询的不同之处
2021/06/03 MySQL
go开发alertmanger实现钉钉报警
2021/07/16 Golang