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 23 Python
如何在Python中编写并发程序
Feb 27 Python
python 列表,数组,矩阵两两转换tolist()的实例
Apr 04 Python
用pandas按列合并两个文件的实例
Apr 12 Python
Python批量发送post请求的实现代码
May 05 Python
python定时复制远程文件夹中所有文件
Apr 30 Python
使用python爬取抖音视频列表信息
Jul 15 Python
pycharm修改文件的默认打开方式的步骤
Jul 29 Python
解析Python3中的Import
Oct 13 Python
python多维数组分位数的求取方式
Mar 03 Python
使用Python webdriver图书馆抢座自动预约的正确方法
Mar 04 Python
Python之matplotlib绘制饼图
Apr 13 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
phpExcel导出大量数据出现内存溢出错误的解决方法
2013/02/28 PHP
屏蔽F1~F12的快捷键的js函数
2010/05/06 Javascript
js location.replace与location.reload的区别
2010/09/08 Javascript
一个JQuery操作Table的代码分享
2012/03/30 Javascript
jquery实现每个数字上都带进度条的幻灯片
2013/02/20 Javascript
node.js中watch机制详解
2014/11/17 Javascript
JS+CSS实现仿新浪微博搜索框的方法
2015/02/24 Javascript
Javascript实现获取及设置光标位置的方法
2015/07/21 Javascript
基于jQuery实现在线选座之高铁版
2015/08/24 Javascript
WebApi+Bootstrap+KnockoutJs打造单页面程序
2016/05/16 Javascript
js实现登录框鼠标拖拽效果
2017/03/09 Javascript
详解Vue方法与事件
2017/03/09 Javascript
vue2.x集成百度UEditor富文本编辑器的方法
2018/09/21 Javascript
Vue2.0 实现页面缓存和不缓存的方式
2019/11/12 Javascript
Vue computed 计算属性代码实例
2020/04/22 Javascript
python3使用urllib示例取googletranslate(谷歌翻译)
2014/01/23 Python
Python的randrange()方法使用教程
2015/05/15 Python
将Emacs打造成强大的Python代码编辑工具
2015/11/20 Python
Python遍历文件夹和读写文件的实现代码
2016/08/28 Python
Numpy 将二维图像矩阵转换为一维向量的方法
2018/06/05 Python
pygame实现俄罗斯方块游戏(基础篇2)
2019/10/29 Python
Python tornado上传文件的功能
2020/03/26 Python
中国京东和泰国中央集团合资的网站:JD CENTRAL
2020/08/22 全球购物
便利店投资创业计划书
2014/02/08 职场文书
开学典礼感言
2014/02/16 职场文书
海飞丝的广告词
2014/03/20 职场文书
市场总经理岗位职责
2014/04/11 职场文书
《蚕姑娘》教学反思
2014/04/15 职场文书
小学数学课后反思
2014/04/23 职场文书
2014年教师节演讲稿
2014/09/03 职场文书
中学图书馆工作总结
2015/08/11 职场文书
golang日志包logger的用法详解
2021/05/05 Golang
HTML5页面音频自动播放的实现方式
2021/06/21 HTML / CSS
Python访问Redis的详细操作
2021/06/26 Python
关于redisson缓存序列化几枚大坑说明
2021/08/04 Redis
微信小程序APP的事件绑定以及传递参数时的冒泡和捕获
2022/04/19 Javascript