Python socket实现简单聊天室


Posted in Python onApril 01, 2018

本文实例为大家分享了Python socket实现简单聊天室的具体代码,供大家参考,具体内容如下

服务端使用了select模块,实现了对多个socket的监控。客户端由于select在Windows下只能对socket使用,所以使用了多线程来实现对客户端输入和socket连接的同时监控。注意这里的socket设置为了非阻塞。这样就实现了在一个线程中同时进行socket的接收和发送。

服务器代码:

# -*- coding: utf-8 -*-
import socket,select

connection_list = []
host = ''
port = 10001

def board_cast(sock,message):
 for socket in connection_list:
  if socket != server_sock and socket != sock:
   try:
    socket.send(message)
   except:
    socket.close()
    print str(socket.getpeername())+' is offline'
    connection_list.remove(socket)

server_sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
server_sock.setblocking(0)
server_sock.bind((host,port))
server_sock.listen(10)
connection_list.append(server_sock)

while 1:
 readable,writable,error = select.select(connection_list,[],[])
 for sock in readable:
  if sock == server_sock:
   connection,connection_add = sock.accept()
   message = str(connection_add)+'enter room'
   board_cast(connection,message)
   print connection_add,'%s connect'
   connection_list.append(connection)
  else:
   try:
    date = sock.recv(1024)
    print date
    board_cast(sock,'('+str(sock.getpeername())+') :'+date)
   except:
    message2 = str(sock.getpeername())+ 'is offline'
    board_cast(sock,message2)
    print str(sock.getpeername())+ ' is offline'
    sock.close()
    connection_list.remove(sock)
    continue

客户端代码:

# -*- coding: utf-8 -*-
import socket,threading,time
flag = 0
date = ''
lock = threading.Lock()

host = 'localhost'
port = 10001
client_sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client_sock.setblocking(0)

class Mythread1(threading.Thread):
 def __init__(self):
  threading.Thread.__init__(self)
 def run(self):
  global flag, date
  while 1:
   date = raw_input()
   if len(date):
    lock.acquire()
    flag = 1
    lock.release()

class Mythread2(threading.Thread):
 def __init__(self):
  threading.Thread.__init__(self)
 def run(self):
  global flag
  global date
  while 1:
   try:
    buf = client_sock.recv(1024)
    if len(buf):
     print buf
   except:
    pass
   if flag:
    try:
     client_sock.send(date)
    except socket.error, e:
     print e
    lock.acquire()
    flag = 0
    lock.release()



try:
 client_sock.connect((host,port))
 print"连接成功"
except socket.error,e:
 print e

t1 = Mythread1()
t2 = Mythread2()
t1.start()
t2.start()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中for语句简单遍历数据的方法
May 07 Python
使用python调用zxing库生成二维码图片详解
Jan 10 Python
python实现K最近邻算法
Jan 29 Python
详解Django的CSRF认证实现
Oct 09 Python
Python基于scipy实现信号滤波功能
May 08 Python
Python分布式进程中你会遇到的问题解析
May 28 Python
利用python中集合的唯一性实现去重
Feb 11 Python
Python接口测试数据库封装实现原理
May 09 Python
利用Python实现朋友圈中的九宫格图片效果
Sep 03 Python
Django实现简单的分页功能
Feb 22 Python
总结Pyinstaller打包的高级用法
Jun 28 Python
详解Python如何批量采集京东商品数据流程
Jan 22 Python
简单实现python聊天程序
Apr 01 #Python
简单实现Python爬取网络图片
Apr 01 #Python
Python中elasticsearch插入和更新数据的实现方法
Apr 01 #Python
python之DataFrame实现excel合并单元格
Feb 22 #Python
python合并同类型excel表格的方法
Apr 01 #Python
python实现两个文件合并功能
Apr 01 #Python
Python中一行和多行import模块问题
Apr 01 #Python
You might like
Windows下的PHP安装文件线程安全和非线程安全的区别
2014/04/23 PHP
ThinkPHP验证码和分页实例教程
2014/08/22 PHP
PHP编写文件多服务器同步程序
2016/07/02 PHP
Mac下关于PHP环境和扩展的安装详解
2019/10/17 PHP
可输入的下拉框
2006/06/19 Javascript
js调用flash的效果代码
2008/04/26 Javascript
基于JQuery制作的产品广告效果
2010/12/08 Javascript
jquery 操作表格实现代码(多种操作打包)
2011/03/20 Javascript
js实现上传图片之上传前预览图片
2013/03/25 Javascript
javascript中style.left和offsetLeft的用法说明
2014/03/07 Javascript
css与javascript跨浏览器兼容性总结
2014/09/15 Javascript
JS实现固定在右下角可展开收缩DIV层的方法
2015/02/13 Javascript
JavaScript中使用数组方法汇总
2016/02/16 Javascript
使用递归遍历对象获得value值的实现方法
2016/06/14 Javascript
bootstrap select插件封装成Vue2.0组件
2017/04/17 Javascript
详解如何使用webpack打包Vue工程
2017/05/27 Javascript
Node.js使用Koa搭建 基础项目
2018/01/08 Javascript
vue2实现搜索结果中的搜索关键字高亮的代码
2018/08/29 Javascript
Webpack按需加载打包chunk命名的方法
2019/09/22 Javascript
react PropTypes校验传递的值操作示例
2020/04/28 Javascript
JS代码简洁方式之函数方法详解
2020/07/28 Javascript
[01:06:42]VP vs NewBee Supermajor 胜者组 BO3 第二场 6.5
2018/06/06 DOTA
Python3实现Web网页图片下载
2016/01/28 Python
python 执行文件时额外参数获取的实例
2018/12/18 Python
Python图像处理之图像的读取、显示与保存操作【测试可用】
2019/01/04 Python
python xlwt如何设置单元格的自定义背景颜色
2019/09/03 Python
如何给Python代码进行加密
2020/01/10 Python
python统计字符的个数代码实例
2020/02/07 Python
Python 跨.py文件调用自定义函数说明
2020/06/01 Python
英国的知名精品百货公司:House of Fraser(福来德)
2016/08/14 全球购物
保加利亚运动鞋购物网站:SneakerStudio.bg
2020/12/23 全球购物
优秀驾驶员先进事迹材料
2014/05/04 职场文书
酒店开业庆典策划方案
2014/05/28 职场文书
Python入门之使用pandas分析excel数据
2021/05/12 Python
JavaScript实例 ODO List分析
2022/01/22 Javascript
python区块链实现简版工作量证明
2022/05/25 Python