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 40行代码实现人脸识别功能
Apr 02 Python
Python中如何优雅的合并两个字典(dict)方法示例
Aug 09 Python
python opencv3实现人脸识别(windows)
May 25 Python
Python迭代器与生成器用法实例分析
Jul 09 Python
Python过滤txt文件内重复内容的方法
Oct 21 Python
python消除序列的重复值并保持顺序不变的实例
Nov 08 Python
详解重置Django migration的常见方式
Feb 15 Python
python GUI实现小球满屏乱跑效果
May 09 Python
基于sklearn实现Bagging算法(python)
Jul 11 Python
pytorch实现从本地加载 .pth 格式模型
Feb 14 Python
python 成功引入包但无法正常调用的解决
Mar 09 Python
聊聊Python pandas 中loc函数的使用,及跟iloc的区别说明
Mar 03 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
php购物网站支付paypal使用方法
2010/11/28 PHP
腾讯QQ微博API接口获取微博内容
2013/10/30 PHP
PHP制作万年历
2015/01/07 PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
2017/06/06 PHP
Yii2 如何在modules中添加验证码的方法
2017/06/19 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
修改Laravel自带的认证系统的User类的命名空间的步骤
2019/10/15 PHP
学习ExtJS Column布局
2009/10/08 Javascript
javascript对象之内置对象Math使用方法
2010/04/16 Javascript
解决jQuery插件tipswindown与hintbox冲突
2010/11/05 Javascript
javascript自执行函数之伪命名空间封装法
2010/12/25 Javascript
cookie在javascript中的使用技巧以及隐私在服务器端的设置
2012/12/03 Javascript
javascript正则表达式参数/g与/i及/gi的使用指南
2014/08/27 Javascript
JavaScript和CSS交互的方法汇总
2014/12/02 Javascript
AngularJS 使用$sce控制代码安全检查
2016/01/05 Javascript
深入理解jquery自定义动画animate()
2016/05/24 Javascript
详解Node.js中path模块的resolve()和join()方法的区别
2018/10/29 Javascript
vue相同路由跳转强制刷新该路由组件操作
2020/08/05 Javascript
原生js实现贪吃蛇游戏
2020/10/26 Javascript
Python实现判断一个字符串是否包含子串的方法总结
2017/11/21 Python
PyCharm在win10的64位系统安装实例
2017/11/26 Python
pycharm下打开、执行并调试scrapy爬虫程序的方法
2017/11/29 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
2018/02/13 Python
Django实现单用户登录的方法示例
2019/03/28 Python
Django实现web端tailf日志文件功能及实例详解
2019/07/28 Python
python实现本地批量ping多个IP的方法示例
2019/08/07 Python
python无序链表删除重复项的方法
2020/01/17 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
PyCharm2019 安装和配置教程详解附激活码
2020/07/31 Python
Python编写memcached启动脚本代码实例
2020/08/14 Python
Python爬虫入门教程01之爬取豆瓣Top电影
2021/01/24 Python
Fabletics官网:美国运动服饰品牌,由好莱坞女演员凯特·哈德森创立
2019/10/19 全球购物
开业主持词
2014/03/21 职场文书
开展党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
小程序与后端Java接口交互实现HelloWorld入门
2021/07/09 Java/Android
MySQL数据库中的锁、解锁以及删除事务
2022/05/06 MySQL