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实现拉钩网上的FizzBuzzWhizz问题示例
May 05 Python
在Python中使用元类的教程
Apr 28 Python
python 检查文件mime类型的方法
Dec 08 Python
Python逐行读取文件中内容的简单方法
Feb 26 Python
python的内存管理和垃圾回收机制详解
May 18 Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
Jun 27 Python
python实现输入任意一个大写字母生成金字塔的示例
Oct 27 Python
linux环境下安装python虚拟环境及注意事项
Jan 07 Python
使用 tf.nn.dynamic_rnn 展开时间维度方式
Jan 21 Python
python 串行执行和并行执行实例
Apr 30 Python
python安装后的目录在哪里
Jun 21 Python
Python中常用的os操作汇总
Nov 05 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
《逃离塔科夫》——“萌新劝退,老手自嗨”的硬核FPS游戏
2020/04/03 其他游戏
PHP处理SQL脚本文件导入到MySQL的代码实例
2014/03/17 PHP
AJAX使用了UpdatePanel后无法使用alert弹出脚本
2010/04/02 Javascript
JavaScript自定义DateDiff函数(兼容所有浏览器)
2012/03/01 Javascript
基于jQuery的弹出框插件
2012/03/18 Javascript
JS使用正则表达式除去字符串中重复字符的方法
2015/11/05 Javascript
深入理解JavaScript 函数
2016/06/06 Javascript
浅析jQuery 3.0中的Data
2016/06/14 Javascript
jQuery电话号码验证实例
2017/01/05 Javascript
详解Vue.js组件可复用性的混合(mixin)方式和自定义指令
2017/09/06 Javascript
nodejs中密码加密处理操作详解
2018/03/20 NodeJs
vue.js学习笔记之v-bind和v-on解析
2018/05/03 Javascript
nuxt框架中路由鉴权之Koa和Session的用法
2018/05/09 Javascript
jQuery+Datatables实现表格批量删除功能【推荐】
2018/10/24 jQuery
jQuery Migrate 插件用法实例详解
2019/05/22 jQuery
vue实现图片预览组件封装与使用
2019/07/13 Javascript
Vue + Element UI图片上传控件使用详解
2019/08/20 Javascript
vue2.x 对象劫持的原理实现
2020/04/19 Javascript
Vue封装Axios请求和拦截器的步骤
2020/09/16 Javascript
详解 javascript对象创建模式
2020/10/30 Javascript
实例解析Python设计模式编程之桥接模式的运用
2016/03/02 Python
用Python徒手撸一个股票回测框架搭建【推荐】
2019/08/05 Python
python或C++读取指定文件夹下的所有图片
2019/08/31 Python
谈谈Python:为什么类中的私有属性可以在外部赋值并访问
2020/03/05 Python
python模拟哔哩哔哩滑块登入验证的实现
2020/04/24 Python
python编程的核心知识点总结
2021/02/08 Python
俄罗斯最大的灯具网站:Fandeco
2020/03/14 全球购物
社区七一党员活动方案
2014/01/25 职场文书
六一儿童节主持词
2014/03/21 职场文书
二年级评语大全
2014/04/23 职场文书
出国留学担保书
2014/05/20 职场文书
2014年小学英语教师工作总
2014/12/03 职场文书
我是特种兵观后感
2015/06/11 职场文书
葬礼主持词
2015/07/02 职场文书
如何计划开一家便利店?
2019/07/31 职场文书
CSS基础详解
2021/10/16 HTML / CSS