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 实现堆排序算法代码
Jun 05 Python
Python使用PyGreSQL操作PostgreSQL数据库教程
Jul 30 Python
对dataframe进行列相加,行相加的实例
Jun 08 Python
python实现定时提取实时日志程序
Jun 22 Python
Python爬虫设置代理IP(图文)
Dec 23 Python
pycharm激活码有效到2020年11月底
Sep 18 Python
tensorflow模型文件(ckpt)转pb文件的方法(不知道输出节点名)
Apr 22 Python
浅谈pandas dataframe对除数是零的处理
Jul 20 Python
Python读取Excel一列并计算所有对象出现次数的方法
Sep 04 Python
用Python提取PDF表格的方法
Apr 11 Python
Pytorch反向传播中的细节-计算梯度时的默认累加操作
Jun 05 Python
Python中json.load()和json.loads()有哪些区别
Jun 07 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
支持oicq头像的留言簿(一)
2006/10/09 PHP
PHP cdata 处理(详细介绍)
2013/07/05 PHP
简单的php+mysql聊天室实现方法(附源码)
2016/01/05 PHP
Laravel4中的Validator验证扩展用法详解
2016/07/26 PHP
Laravel框架定时任务2种实现方式示例
2018/12/08 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
2020/04/04 PHP
Javascript 检测、添加、移除样式(className)函数代码
2009/09/08 Javascript
jquery formValidator插件ajax验证 内容不做任何修改再离开提示错误的bug解决方法
2013/01/04 Javascript
javascript实现checkBox的全选,反选与赋值
2015/03/12 Javascript
JavaScript实现简单图片翻转的方法
2015/04/17 Javascript
vue中eventbus被多次触发以及踩过的坑
2017/12/02 Javascript
Vue组件化开发思考
2018/02/02 Javascript
vue 表单输入格式化中文输入法异常问题
2018/05/30 Javascript
bootstrap模态框弹出和隐藏,动态改变中间内容的实例
2018/08/10 Javascript
PM2自动部署代码步骤流程总结
2018/12/10 Javascript
使用vue重构资讯页面的实例代码解析
2019/11/26 Javascript
vue-cli3使用mock数据的方法分析
2020/03/16 Javascript
JavaScript 禁止用户保存图片的实现代码
2020/04/28 Javascript
原生JavaScript实现幻灯片效果
2021/02/19 Javascript
简洁的十分钟Python入门教程
2015/04/03 Python
Python 多线程实例详解
2017/03/25 Python
Python实现的读写json文件功能示例
2018/06/05 Python
Python多进程写入同一文件的方法
2019/01/14 Python
Pycharm Git 设置方法
2020/09/15 Python
python使用yaml 管理selenium元素的示例
2020/12/01 Python
实例讲解CSS3中Transform的perspective属性的用法
2016/04/22 HTML / CSS
前端canvas动画如何转成mp4视频的方法
2019/06/17 HTML / CSS
HTML5的download属性详细介绍和使用实例
2014/04/23 HTML / CSS
Html5 webview元素定位工具的实现
2020/08/07 HTML / CSS
英国最大的经认证的有机超市:Planet Organic
2018/02/02 全球购物
成人高等教育毕业生自我鉴定
2013/10/22 职场文书
中文专业毕业生自荐书范文
2014/01/04 职场文书
党员评议个人总结
2014/10/20 职场文书
十八大观后感
2015/06/12 职场文书
小学四年级班主任工作经验交流材料
2015/11/02 职场文书
Python游戏开发实例之graphics实现AI五子棋
2021/11/01 Python