多人聊天室 (多线程 || epoll)

虚树极昼
• 阅读 1872

使用多线程缺点很明显,服务器为每个客户开一个线程,每个线程都阻塞等待读
客户端需要两个线程,一个用来读,一个用来写。
epoll的代码还在研究中
https://github.com/jwzh222/epoll
可以参考这个
顺便一提windows下没有epoll,只有Linux支持。

import socket
import threading
socket_list = []
s = socket.socket()
s.bind(('127.0.0.1', 8888))
s.listen()
def read_client(s):
    try:
        # 接收客户端的数据
        return s.recv(2048).decode('utf-8')
    except:
        # 若有异常,说明连接失败,则删除该socket
        print(str(addr) + ' Left!')
        socket_list.remove(s)
def socket_target(s):
    try:
        while True:
            content = read_client(s)
            if content is None:
                break
            else:
                print(content)
            # 将一个客户端发送过来的数据广播给其他客户端
                for client in socket_list:
                    client.send((str(addr) + ' say: ' + content).encode('utf-8'))
    except:
        print('Error!')
while True:
    conn, addr = s.accept()
    # 每当有客户连接后,就将其加到socket列表中
    socket_list.append(conn)
    print(str(addr) + ' Joined!')
    # 每当有客户连接后,就启动一个线程为其服务
    threading.Thread(target=socket_target, args=(conn,)).start()
import socket
import threading
s = socket.socket()
s.connect(('10.34.22.166', 8888))

def read_server(s):
    while True:
        # 子线程负责从服务端接受数据并打印
        content = s.recv(2048).decode('utf-8')
        print(content)

threading.Thread(target=read_server, args=(s,)).start()     

while True:
    line = input('')
    if line == 'exit':
        break
 # 主线程负责将用户输入的数据发送到socket中
    s.send(line.encode('utf-8'))
点赞
收藏
评论区
推荐文章
半臻 半臻
4年前
Python基础10——线程、进程、协程
18线程18.1进程和线程进程:打开一个程序至少就会有一个进程。操作系统进行资源分配的基本单位线程:线程是CPU调度的基本单位,每个进程至少都有一个线程。单线程:只有一个线程pythondeffuna():print(123)deffunb():print(456)funa()funb()先执行funa再执行funb多线程线程
Easter79 Easter79
3年前
tornado配合celery及rabbitmq实现web request异步非阻塞
Tornado和Celery介绍1.TornadoTornado是一个用python编写的一个强大的、可扩展的异步HTTP服务器,同时也是一个web开发框架。tornado是一个非阻塞式web服务器,其速度相当快。得利于其非阻塞的方式和对epoll的运用,tornado每秒可以处理数以千计的
Wesley13 Wesley13
3年前
java多线程的3种实现方式
多线程相关的问题1.什么是进程?​正在执行的程序2.什么是线程?​进程的子单位,一个能够完成独立功能的执行路径3.为什么需要开启多线程?当执行某些耗时操作的任务的时候需要开启多线程,防止线程阻塞能够让两个任务看起来像是在同时执行
喷火龙 喷火龙
4年前
40个Java多线程问题总结
前言Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多、越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的。这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题。这些多
Bill78 Bill78
4年前
python多线程详解
python中的多线程是一个非常重要的知识点,今天为大家对多线程进行详细的说明,代码中的注释有多线程的知识点还有测试用的实例。码字不易,阅读或复制完了,点个赞!importthreadingfromthreadingimportLock,Threadimporttime,os'''
Wesley13 Wesley13
3年前
NIO如何多线程操作
因为NIO本身是非阻塞的,所以他的消息选择器Selector可以在单线程下连接多台客户端的访问。为了加强NIO的性能,我们加入多线程的操作,当然NIO并不能简单的把Selector.select()放入Executor.execute(Runnable)的run方法中。为完成NIO的多线程,我们应该有一个调度类,一个服务类。调度类的目的是初始化一
Wesley13 Wesley13
3年前
C++11多线程
C11开始支持多线程编程,之前多线程编程都需要系统的支持,在不同的系统下创建线程需要不同的API如pthread\_create(),Createthread(),beginthread()等,使用起来都比较复杂,C11提供了新头文件<thread、<mutex、<atomic、<future等用于支持多线程。使用C11开启一个线
Stella981 Stella981
3年前
Epoll 服务器示例
epoll服务器示例,监听5000个端口,使用线程池收藏运行这个程序需要预先设置栈内存和文件描述符上限,否则运行失败ulimitn16384ulimits4096文件名:server.c编译:gccserver.cWallO2pthreadoserverinclude<unist
Wesley13 Wesley13
3年前
Java并发编程:多线程如何实现阻塞与唤醒
线程的阻塞和唤醒在多线程并发过程中是一个关键点,当线程数量达到很大的数量级时,并发可能带来很多隐蔽的问题。如何正确暂停一个线程,暂停后又如何在一个要求的时间点恢复,这些都需要仔细考虑的细节。Java为我们提供了多种API来对线程进行阻塞和唤醒操作,比如suspend与resume、sleep、wait与notify以及park与unpark等等。!(
Wesley13 Wesley13
3年前
Java 并发编程:多线程如何实现阻塞与唤醒
线程的阻塞和唤醒在多线程并发过程中是一个关键点,当线程数量达到很大的数量级时,并发可能带来很多隐蔽的问题。如何正确暂停一个线程,暂停后又如何在一个要求的时间点恢复,这些都需要仔细考虑的细节。Java为我们提供了多种API来对线程进行阻塞和唤醒操作,比如suspend与resume、sleep、wait与notify以及park与unpark等等。!(
Wesley13 Wesley13
3年前
NIO
一、什么是阻塞和非阻塞?传统的IO流都是阻塞式的。也就是说,当一个线程调用read()或write()时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务。因此,在完成网络通信进行IO操作时,由于线程会阻塞,所以服务器端必须为每个客户端都提供一个独立的线程进行处理,当服务器端