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 相关文章推荐
pycharm 使用心得(六)进行简单的数据库管理
Jun 06 Python
Python编写电话薄实现增删改查功能
May 07 Python
Pycharm 操作Django Model的简单运用方法
May 23 Python
Django REST framework视图的用法
Jan 16 Python
selenium+python自动化测试之环境搭建
Jan 23 Python
详解Python连接MySQL数据库的多种方式
Apr 16 Python
python 反编译exe文件为py文件的实例代码
Jun 27 Python
Python解析命令行读取参数之argparse模块
Jul 26 Python
pygame实现俄罗斯方块游戏(对战篇1)
Oct 29 Python
tensorflow查看ckpt各节点名称实例
Jan 21 Python
Python几种常见算法汇总
Jun 02 Python
一篇文章带你了解Python和Java的正则表达式对比
Sep 15 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数组的使用方法小结
2010/09/23 PHP
关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题
2015/12/21 PHP
利用php的ob缓存机制实现页面静态化方法
2017/07/09 PHP
强悍无比的WEB开发好助手FireBug(Firefox Plugin)
2007/01/16 Javascript
js中对象的声明方式以及数组的一些用法示例
2013/12/11 Javascript
javascript实现简单的Map示例介绍
2013/12/23 Javascript
jquery实现更改表格行顺序示例
2014/04/30 Javascript
3种Jquery限制文本框只能输入数字字母的方法
2014/12/03 Javascript
简单的JS时钟实例讲解
2016/01/13 Javascript
node.js cookie-parser之parser.js
2016/06/06 Javascript
javascript简单实现等比例缩小图片的方法
2016/07/27 Javascript
Bootstrap Scrollspy源码学习
2017/03/02 Javascript
JavaScript数组和对象的复制
2017/03/21 Javascript
Bootstrap标签页(Tab)插件使用方法
2017/03/21 Javascript
原生js的ajax和解决跨域的jsonp(实例讲解)
2017/10/16 Javascript
原生JS实现动态加载js文件并在加载成功后执行回调函数的方法
2020/12/30 Javascript
js单线程的本质 Event Loop解析
2019/10/29 Javascript
vue 实现购物车总价计算
2019/11/06 Javascript
微信小程序实现分页加载效果
2020/11/19 Javascript
[31:33]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第一场
2014/05/23 DOTA
python 异常处理总结
2016/10/18 Python
python 链接和操作 memcache方法
2017/03/04 Python
Python将多个excel文件合并为一个文件
2018/01/03 Python
如何优雅地改进Django中的模板碎片缓存详解
2018/07/04 Python
了解不常见但是实用的Python技巧
2019/05/23 Python
django 解决扩展自带User表遇到的问题
2020/05/14 Python
python使用多线程+socket实现端口扫描
2020/05/28 Python
python中的时区问题
2021/01/14 Python
详解HTML5之pushstate、popstate操作history,无刷新改变当前url
2017/03/15 HTML / CSS
美国婚礼和派对礼品网站:Kate Aspen(新娘送礼会、迎婴派对)
2018/03/28 全球购物
东南亚排名第一的服务市场:kaodim
2019/03/28 全球购物
字符串str除首尾字符外的其他字符按升序排列
2013/03/08 面试题
自考生自我鉴定范文
2013/10/01 职场文书
师范应届生教师求职信
2013/11/05 职场文书
大学生思想汇报范文
2013/12/31 职场文书
2015年科普工作总结
2015/07/23 职场文书