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 开发者节省时间的10个方法
Oct 02 Python
Numpy数组的保存与读取方法
Apr 04 Python
tensorflow: variable的值与variable.read_value()的值区别详解
Jul 30 Python
Python选择网卡发包及接收数据包
Apr 04 Python
python实现简单图书管理系统
Nov 22 Python
使用Python操作ArangoDB的方法步骤
Feb 02 Python
TensorFlow2.X使用图片制作简单的数据集训练模型
Apr 08 Python
Python使用os.listdir和os.walk获取文件路径
May 21 Python
pycharm sciview的图片另存为操作
Jun 01 Python
Python如何读写CSV文件
Aug 13 Python
使用Pytorch搭建模型的步骤
Nov 16 Python
Python中Pyspider爬虫框架的基本使用详解
Jan 27 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实现二维数组按某列进行排序的方法
2016/11/18 PHP
PHP清除缓存的几种方法总结
2017/09/12 PHP
js中复制行和删除行的操作实例
2013/06/25 Javascript
JavaScript动态插入script的基本思路及实现函数
2013/11/11 Javascript
JavaScript中Boolean对象的属性解析
2015/10/21 Javascript
javascript入门教程基础篇
2015/11/16 Javascript
理解javascript对象继承
2016/04/17 Javascript
jQuery基于扩展简单实现倒计时功能的方法
2016/05/14 Javascript
使用JavaScript触发过渡效果的方法
2017/01/19 Javascript
JS实现的DIV块来回滚动效果示例
2017/02/07 Javascript
AngularJS解决ng-if中的ng-model值无效的问题
2017/06/21 Javascript
详解使用路由延迟加载 Angular 模块
2017/10/12 Javascript
Vue官方文档梳理之全局配置
2017/11/22 Javascript
JS实现判断图片是否加载完成的方法分析
2018/07/31 Javascript
vue多层嵌套路由实例分析
2019/03/19 Javascript
JS中的算法与数据结构之列表(List)实例详解
2019/08/16 Javascript
vue各种事件监听实例(小结)
2020/06/24 Javascript
[15:35]教你分分钟做大人:天怒法师
2014/10/30 DOTA
用Python计算三角函数之atan()方法的使用
2015/05/15 Python
python @property的用法及含义全面解析
2018/02/01 Python
Python使用POP3和SMTP协议收发邮件的示例代码
2019/04/16 Python
python二维码操作:对QRCode和MyQR入门详解
2019/06/24 Python
python matplotlib库绘制条形图练习题
2019/08/10 Python
PyTorch中Tensor的维度变换实现
2019/08/18 Python
美国在线轮胎零售商:SimpleTire
2019/04/08 全球购物
经济与贸易专业应届生求职信
2013/11/19 职场文书
园林施工员岗位职责
2013/12/11 职场文书
《口技》教学反思
2014/02/21 职场文书
我们的节日端午节活动方案
2014/03/02 职场文书
用人单位的规章制度,怎样制定才是有效的?
2019/07/09 职场文书
Python手拉手教你爬取贝壳房源数据的实战教程
2021/05/21 Python
浅谈MySQL之浅入深出页原理
2021/06/23 MySQL
Python 类,对象,数据分类,函数参数传递详解
2021/09/25 Python
JavaScript阻止事件冒泡的方法
2021/12/06 Javascript
win11无法登录onedrive错误代码0x8004def7怎么办 ?
2022/04/05 数码科技