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中的reduce内建函数使用方法指南
Aug 31 Python
python基础教程之Filter使用方法
Jan 17 Python
Python基于scapy实现修改IP发送请求的方法示例
Jul 08 Python
python中logging库的使用总结
Oct 18 Python
python使用正则表达式替换匹配成功的组
Nov 17 Python
Python实现控制台中的进度条功能代码
Dec 22 Python
利用Pandas读取文件路径或文件名称包含中文的csv文件方法
Jul 04 Python
Python BS4库的安装与使用详解
Aug 08 Python
python中报错"json.decoder.JSONDecodeError: Expecting value:"的解决
Apr 29 Python
Python列表操作方法详解
Feb 09 Python
Python模拟伯努利试验和二项分布代码实例
May 27 Python
如何利用python web框架做文件流下载的实现示例
Jun 02 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动态创建Flash动画
2006/10/09 PHP
php使HTML标签自动补全闭合函数代码
2012/10/04 PHP
php实现加减法验证码代码
2014/02/14 PHP
PHP整合七牛实现上传文件
2015/07/03 PHP
经验几则 推荐
2006/09/05 Javascript
实现连缀调用的map方法(prototype)
2009/08/05 Javascript
JavaScript 编写匿名函数的几种方法
2010/02/21 Javascript
JS字符串截取函数实例
2013/12/27 Javascript
JSON.parse()和JSON.stringify()使用介绍
2014/06/20 Javascript
JS+CSS实现可拖拽的漂亮圆角特效弹出层完整实例
2015/02/13 Javascript
多个jQuery版本共存的处理方案
2015/03/17 Javascript
javascript中 try catch用法
2015/08/16 Javascript
JavaScript高级程序设计(第三版)学习笔记6、7章
2016/03/11 Javascript
关于JS中match() 和 exec() 返回值和属性的测试
2016/03/21 Javascript
bootstrap table服务端实现分页效果
2017/08/10 Javascript
ant-design-vue 实现表格内部字段验证功能
2019/12/16 Javascript
Javascript实现单选框效果
2020/12/09 Javascript
Python爬虫通过替换http request header来欺骗浏览器实现登录功能
2018/01/07 Python
Python中使用Counter进行字典创建以及key数量统计的方法
2018/07/06 Python
在python中使用with打开多个文件的方法
2019/01/07 Python
基于python历史天气采集的分析
2019/02/14 Python
Python 中的pygame安装与配置教程详解
2020/02/10 Python
python opencv进行图像拼接
2020/03/27 Python
护理专业推荐信
2013/11/07 职场文书
库房主管岗位职责
2013/12/31 职场文书
公休请假条
2014/04/11 职场文书
诚信考试承诺书范文
2015/04/29 职场文书
升学宴家长答谢词
2015/09/29 职场文书
班主任班级管理心得体会
2016/01/07 职场文书
详解Python小数据池和代码块缓存机制
2021/04/07 Python
python 命令行传参方法总结
2021/05/25 Python
PHP实现两种排课方式
2021/06/26 PHP
python中if和elif的区别介绍
2021/11/07 Python
Python中super().__init__()测试以及理解
2021/12/06 Python
Vue2.0搭建脚手架
2022/03/13 Vue.js
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
2022/05/25 SQL Server