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中关于字符串对象的一些基础知识
Apr 08 Python
分析并输出Python代码依赖的库的实现代码
Aug 09 Python
Python连接mysql数据库的正确姿势
Feb 03 Python
Python装饰器的执行过程实例分析
Jun 04 Python
opencv python 基于KNN的手写体识别的实例
Aug 03 Python
python 通过SSHTunnelForwarder隧道连接redis的方法
Feb 19 Python
python实现超市商品销售管理系统
Oct 25 Python
python实现俄罗斯方块游戏(改进版)
Mar 13 Python
Jupyter notebook如何实现指定浏览器打开
May 13 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
May 25 Python
解决python3.6用cx_Oracle库连接Oracle的问题
Dec 07 Python
Python3压缩和解压缩实现代码
Mar 01 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实现图象锐化代码
2007/06/14 PHP
php实现的仿阿里巴巴实现同类产品翻页
2009/12/11 PHP
php实现的Captcha验证码类实例
2014/09/22 PHP
php中JSON的使用方法
2015/04/30 PHP
PHP实现HTTP断点续传的方法
2015/06/17 PHP
PHP二进制与字符串之间的相互转换教程
2016/10/14 PHP
php array_values 返回数组的值实例详解
2016/11/17 PHP
php 处理png图片白色背景色改为透明色的实例代码
2018/12/10 PHP
JS代码优化技巧之通俗版(减少js体积)
2011/12/23 Javascript
MyEclipse取消验证Js的两种方法
2013/11/14 Javascript
jQuery中:input选择器用法实例
2015/01/03 Javascript
jquery实现实时改变网页字体大小、字体背景色和颜色的方法
2015/08/05 Javascript
使用伪命名空间封装保护独自创建的对象方法
2016/08/04 Javascript
基于vue.js实现图片轮播效果
2016/12/01 Javascript
webpack配置的最佳实践分享
2017/04/21 Javascript
JavaScript函数、闭包、原型、面向对象学习笔记
2018/09/06 Javascript
vue模式history下在iis中配置流程
2019/04/17 Javascript
Vue+penlayers实现多边形绘制及展示
2020/12/24 Vue.js
浅谈MySQL中的触发器
2015/05/05 Python
Python自动化开发学习之三级菜单制作
2017/07/14 Python
python环形单链表的约瑟夫问题详解
2018/09/27 Python
opencv python如何实现图像二值化
2020/02/03 Python
在python3中实现查找数组中最接近与某值的元素操作
2020/02/29 Python
Python AutoCAD 系统设置的实现方法
2020/04/01 Python
鲜为人知的HTML5语音合成功能
2019/05/17 HTML / CSS
Notino芬兰:购买香水和化妆品
2019/04/15 全球购物
餐厅总经理岗位职责
2013/12/31 职场文书
建筑设计学生的自我评价
2014/01/16 职场文书
应用英语专业自荐信
2014/01/26 职场文书
读书活动实施方案
2014/03/10 职场文书
元宵节主持词
2014/03/25 职场文书
财务管理专业毕业生求职信
2014/06/02 职场文书
《学会看病》教学反思
2016/02/17 职场文书
Python turtle实现贪吃蛇游戏
2021/06/18 Python
Redis命令处理过程源码解析
2022/02/12 Redis
SQLyog的下载、安装、破解、配置教程(MySQL可视化工具安装)
2022/09/23 MySQL