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命令行参数解析OptionParser类用法实例
Oct 09 Python
python入门之语句(if语句、while语句、for语句)
Jan 19 Python
对python numpy数组中冒号的使用方法详解
Apr 17 Python
python 获取当天凌晨零点的时间戳方法
May 22 Python
简单了解python的break、continue、pass
Jul 08 Python
Pytorch中accuracy和loss的计算知识点总结
Sep 10 Python
Pycharm 2019 破解激活方法图文详解
Oct 11 Python
Python : turtle色彩控制实例详解
Jan 19 Python
python range实例用法分享
Feb 06 Python
Django 解决开发自定义抛出异常的问题
May 21 Python
Python 图片添加美颜效果
Apr 28 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 checkbox 取值详细说明
2010/08/19 PHP
PHP仿博客园 个人博客(2) 数据库增添改删
2013/07/05 PHP
浅谈PDO的rowCount函数
2015/06/18 PHP
PHP代码覆盖率统计详解
2020/07/22 PHP
Avengerls vs KG BO3 第二场2.18
2021/03/10 DOTA
jQuery 改变CSS样式基础代码
2010/02/11 Javascript
JS实现仿google、百度搜索框输入信息智能提示的实现方法
2015/04/20 Javascript
js实现搜索框关键字智能匹配代码
2020/03/26 Javascript
Treegrid的动态加载实例代码
2016/04/29 Javascript
JavaScript操作选择对象的简单实例
2016/05/16 Javascript
JS短信验证码倒计时功能的实现(没有验证码,只有倒计时)
2016/10/27 Javascript
js将键值对字符串转为json字符串的方法
2018/03/30 Javascript
JavaScript变量声明var,let.const及区别浅析
2018/04/23 Javascript
javascript面向对象创建对象的方式小结
2019/07/29 Javascript
vue递归组件实战之简单树形控件实例代码
2019/08/27 Javascript
[51:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第二局
2016/03/03 DOTA
[01:02:34]TFT vs VGJ.T Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
[01:02:46]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python使用htpasswd实现基本认证授权的例子
2014/06/10 Python
Python学习教程之常用的内置函数大全
2017/07/14 Python
基于Python socket的端口扫描程序实例代码
2018/02/09 Python
基于python生成器封装的协程类
2019/03/20 Python
详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?
2019/05/07 Python
python实现单链表的方法示例
2019/09/03 Python
Python CategoricalDtype自定义排序实现原理解析
2020/09/11 Python
Python基于pillow库实现生成图片水印
2020/09/14 Python
css3 transform过渡抖动问题解决
2020/10/23 HTML / CSS
英国潮流网站:END.(全球免邮)
2017/01/16 全球购物
英国复古皮包品牌:Beara Beara
2018/07/18 全球购物
美国克罗格超市在线购物:Kroger
2019/06/21 全球购物
卖房协议书
2014/04/11 职场文书
2014年测量员工作总结
2014/12/12 职场文书
车间班组长竞聘书
2015/09/15 职场文书
怎样写工作总结啊!
2019/06/18 职场文书
OpenCV-Python实现人脸美白算法的实例
2021/06/11 Python
Python开发工具Pycharm的安装以及使用步骤总结
2021/06/24 Python