Python socket实现简单聊天室
作者:萧-十一 发布时间:2022-06-20 02:13:27
标签:Python,socket,聊天室
本文实例为大家分享了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()
来源:https://blog.csdn.net/wait_nothing_alone/article/details/53946597


猜你喜欢
- 环境:Zend Studio 8.0Zend Studio是PHP开发者的首选开发工具,其地位相当于微软开发工具中的Visual Studi
- 1、在全局settings文件中配置```MEDIA_URL = '/media/'MEDIA_ROOT = os.path
- python中random.sample()方法可以随机地从指定列表中提取出N个不同的元素,但在实践中发现,当N的值比较大的时候,该方法执行
- 本文完全利用numpy实现一个简单的BP神经网络,由于是做regression而不是classification,因此在这里输出层选取的激励
- 1、注释单行注释,使用#,#号后面的都是注射,例如#我是单行注释print("Hello Python world")多
- 前言本来准备讲解nginx和apache的日志的,但是个人不太推荐apache(纯属个人爱好),这里就不介绍apache的日志了。作为一名程
- Oracle物理结构故障是指构成数据库的各个物理文件损坏而导致的各种数据库故障。这些故障可能是由于硬件故障造成的,也可能是人为误操作而引起。
- 引入依赖#?导入模块import?pymysqlimport?pandas?as?pdimport?numpy?as?npimport?ti
- 使用文中提供的代码做一个统计表每天的新增行数及新增存储空间的功能实现步骤如下:1. 创建表创建表,存储每天的表空间占用情况CREATE TA
- 一、条件分支语句:if基本格式:if (<表达式1>){ <语句组1>}else
- 本文实例讲述了Python实现简单的代理服务器。分享给大家供大家参考。具体如下:具备简单的管理功能,运行后 telnet localhost
- 1.引言创建命令行程序很棒:命令行可以按照我们的设定完成相应的工作,相比GUI界面程序,无需花费数小时尝试使 GUI 正常工作。但有时最好有
- 1、运用re、json、jsonpath包解析json思路(1)re:正则表达式,通过json的形式对症下药,写表达式去解析json;(2)
- 前言在使用keras时候报错Keyerror ‘acc',这是一个keras版本问题,acc和accuracy本意是一样的,但是不同
- 现在我们用python代码实现感知器算法。# -*- coding: utf-8 -*-import numpy as npclass Pe
- 软件版本及平台:MySQL-5.7.17-winx64,win7家庭版一、下载安装包https://cdn.mysql.com//Downl
- linux环境Mysql 5.7.13安装教程分享给大家,供大家参考,具体内容如下1系统约定安装文件下载目录:/data/softwareM
- msxml3.dll 错误 '80004005'未指定的错误/Project/lijiang_071017/include/
- Python中的内建函数和可迭代对象,迭代器求值标识id() #标识id 返回对象的唯一标识,CPython返回内存地址hash() #哈希
- 1.垂直影像拼接 vconcat# -*- coding: utf-8 -*-import cv2image = cv2.imread(&q