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的Flask框架中@app.route的用法教程
Mar 31 Python
Python的组合模式与责任链模式编程示例
Feb 02 Python
python编程羊车门问题代码示例
Oct 25 Python
python 设置文件编码格式的实现方法
Dec 21 Python
Python实现一个服务器监听多个客户端请求
Apr 12 Python
简单了解python代码优化小技巧
Jul 08 Python
使用Python和百度语音识别生成视频字幕的实现
Apr 09 Python
python代码实现图书管理系统
Nov 30 Python
Python 实现二叉查找树的示例代码
Dec 21 Python
Django前后端分离csrf token获取方式
Dec 25 Python
Pytorch反向传播中的细节-计算梯度时的默认累加操作
Jun 05 Python
Python+OpenCV实现在图像上绘制矩形
Mar 21 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/03/11 PHP
php checkbox 取值详细说明
2010/08/19 PHP
关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题
2015/12/21 PHP
Zend Framework框架路由机制代码分析
2016/03/22 PHP
yii2.0实现pathinfo的形式访问的配置方法
2016/04/06 PHP
javascript string字符串优化问题
2011/07/31 Javascript
jQuery 事件的命名空间简单了解
2013/11/22 Javascript
node.js解决获取图片真实文件类型的问题
2014/12/20 Javascript
javascript实现可全选、反选及删除表格的方法
2015/05/15 Javascript
JavaScript学习小结(7)之JS RegExp
2015/11/29 Javascript
JavaScript 基础函数_深入剖析变量和作用域
2016/05/18 Javascript
JavaScript中 this 指向问题深度解析
2017/02/21 Javascript
详解vue中组件参数
2018/07/09 Javascript
vuex 中插件的编写案例解析
2019/06/10 Javascript
利用JavaScript将Excel转换为JSON示例代码
2019/06/14 Javascript
JS获取动态添加元素的方法详解
2019/07/31 Javascript
python简单文本处理的方法
2015/07/10 Python
举例讲解Python的lambda语句声明匿名函数的用法
2016/07/01 Python
python中pika模块问题的深入探究
2018/10/13 Python
python列表list保留顺序去重的实例
2018/12/14 Python
Python 词典(Dict) 加载与保存示例
2019/12/06 Python
python shell命令行中import多层目录下的模块操作
2020/03/09 Python
Banggood官网:面向全球客户的综合商城
2017/04/19 全球购物
澳大利亚运动鞋零售商:The Athlete’s Foot
2018/11/04 全球购物
英国家电购物网站:Sonic Direct
2019/03/26 全球购物
Diamondback自行车:拥有你的冒险
2019/04/22 全球购物
linux面试相关问题
2013/04/28 面试题
继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?
2015/11/18 面试题
大学生感恩父母演讲稿
2014/08/28 职场文书
自查自纠整改报告
2014/11/06 职场文书
2014年党支部书记工作总结
2014/12/04 职场文书
大专护理专业自荐信
2015/03/25 职场文书
八一建军节主持词
2015/07/01 职场文书
2019让人心动的商业计划书
2019/06/27 职场文书
CocosCreator如何实现划过的位置显示纹理
2021/04/14 Javascript
中国古风插画师排行榜:夏达第一,第三是阴阳师姑获鸟皮肤创作者
2022/03/18 国漫