select_server.py

#!/usr/bin/env python3.8
# -*- coding: UTF-8 -*-
# __author: smoke
# file: select_server.py
# time: 2021/06/14

import socket
import select
sk = socket.socket()
sk.bind(('127.0.0.1',8800))
sk.listen(5)


sk1 = socket.socket()
sk1.bind(('127.0.0.1',6667))
sk1.listen(5)

while True:
    r,w,e = select.select([sk,sk1],[],[],5)
    for i in r: #[sk1,]
        conn,add = i.accept()
        print('conn',conn)
        print("hellohellohello")
    print('r:>>>',r)

/home/smoke/文档/DocumentFile/PycharmProjects/选课系统Demo/Jaime/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/io_multiplexing/select_server.py
r:>>> []
r:>>> []

通过IO多路复用实现并发聊天

talk_server.py

#!/usr/bin/env python3.8
# -*- coding: UTF-8 -*-
# __author: smoke
# file: talk_server
# time: 2021/06/17

import socket
import select

sk=socket.socket()

sk.bind(('127.0.0.1',8800))
sk.listen(3)

while True:
    inputs,outputs,errors=select.select([sk,],[],[],5)

    for i in inputs:
        conn,addr=i.accept()
        print(conn)
        data=conn.recv(1024)
        print(data.decode('utf8'))
        conn.sendall(data)

/home/smoke/文档/DocumentFile/PycharmProjects/选课系统Demo/Jaime/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/io_multiplexing/talk_server.py

talk_client.py

#!/usr/bin/env python3.8
# -*- coding: UTF-8 -*-
# __author: smoke
# file: talk_client
# time: 2021/06/17

import time
import socket
sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sk.connect(('127.0.0.1', 8800))

while True:
    inp=input('>>>')
    sk.sendall(bytes(inp,"utf8"))
    data=sk.recv(1024)
    print(data.decode('utf8'))

/home/smoke/文档/DocumentFile/PycharmProjects/选课系统Demo/Jaime/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/io_multiplexing/talk_client.py
>>>hi
hi
>>>smoke    #发一次不让发送了

talk_server.py

/home/smoke/文档/DocumentFile/PycharmProjects/选课系统Demo/Jaime/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/io_multiplexing/talk_server.py
<socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8800), raddr=('127.0.0.1', 56768)>
hi

#!/usr/bin/env python3.8
# -*- coding: UTF-8 -*-
# __author: smoke
# file: talk_server
# time: 2021/06/17

import socket
import select

sk=socket.socket()

sk.bind(('127.0.0.1',8800))
sk.listen(3)

inp=[sk,]
while True:
# for i in inputs:    #[conn,]
    conn,addr=sk.accept()
    print(conn)
    data=conn.recv(1024)
    print(data.decode('utf8'))
    conn.sendall(data)
    inputs,outputs,errors=select.select([conn,],[],[],5)

/home/smoke/文档/DocumentFile/PycharmProjects/选课系统Demo/Jaime/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/io_multiplexing/talk_server.py

talk_client.py

#!/usr/bin/env python3.8
# -*- coding: UTF-8 -*-
# __author: smoke
# file: talk_client
# time: 2021/06/17

import time
import socket
sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sk.connect(('127.0.0.1', 8800))

while True:
    inp=input('>>>')
    sk.sendall(bytes(inp,"utf8"))
    data=sk.recv(1024)
    print(data.decode('utf8'))

/home/smoke/文档/DocumentFile/PycharmProjects/选课系统Demo/Jaime/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/io_multiplexing/talk_client.py
>>>hi
hi
>>>

再运行一次talk_client.py

talk_client.py

/home/smoke/文档/DocumentFile/PycharmProjects/选课系统Demo/Jaime/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/io_multiplexing/talk_client.py
>>>hello
hello
>>>

在第一次运行的客户端继续聊天

talk_client.py

/home/smoke/文档/DocumentFile/PycharmProjects/选课系统Demo/Jaime/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/io_multiplexing/talk_client.py
>>>hi
hi
>>>smoke

>>>

talk_server.py

/home/smoke/文档/DocumentFile/PycharmProjects/选课系统Demo/Jaime/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/io_multiplexing/talk_server.py
<socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8800), raddr=('127.0.0.1', 34984)>
hi
<socket.socket fd=5, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8800), raddr=('127.0.0.1', 38080)>
hello    #server端没有收到第一次运行客户的smoke信息

在第二次运行的客户端继续聊天

talk_client.py

/home/smoke/文档/DocumentFile/PycharmProjects/选课系统Demo/Jaime/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/io_multiplexing/talk_client.py
>>>hello
hello
>>>cherry    #第二个客户端卡死

talk_server.py

#!/usr/bin/env python3.8
# -*- coding: UTF-8 -*-
# __author: smoke
# file: talk_server
# time: 2021/06/17

import socket
import select

sk=socket.socket()

sk.bind(('127.0.0.1',8800))
sk.listen(3)

inp=[sk,]
while True:
    inputs,outputs,errors=select.select(inp,[],[],)
    for obj in inputs:    #[conn,]
        if obj==sk:
            conn,addr=sk.accept()
            print(conn)
            inp.append(conn)
        else:
            data=obj.recv(1024)
            print(data.decode('utf8'))
            Inputs=input('>>>')
            obj.sendall(Inputs.encode('utf8'))

/home/smoke/文档/DocumentFile/PycharmProjects/选课系统Demo/Jaime/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/io_multiplexing/talk_server.py

talk_client.py

#!/usr/bin/env python3.8
# -*- coding: UTF-8 -*-
# __author: smoke
# file: talk_client
# time: 2021/06/17

import time
import socket
sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sk.connect(('127.0.0.1', 8800))

while True:
    inp=input('>>>')
    sk.sendall(bytes(inp,"utf8"))
    data=sk.recv(1024)
    print(data.decode('utf8'))

/home/smoke/文档/DocumentFile/PycharmProjects/选课系统Demo/Jaime/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/io_multiplexing/talk_client.py
>>>hi

talk_server.py

/home/smoke/文档/DocumentFile/PycharmProjects/选课系统Demo/Jaime/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/io_multiplexing/talk_server.py
<socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8800), raddr=('127.0.0.1', 57526)>
hi
>>>hi

talk_client.py

/home/smoke/文档/DocumentFile/PycharmProjects/选课系统Demo/Jaime/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/io_multiplexing/talk_client.py
>>>hi
hi
>>>

再运行一次talk_client.py

talk_client.py

/home/smoke/文档/DocumentFile/PycharmProjects/选课系统Demo/Jaime/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/io_multiplexing/talk_client.py
>>>hello

talk_server.py

/home/smoke/文档/DocumentFile/PycharmProjects/选课系统Demo/Jaime/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/io_multiplexing/talk_server.py
<socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8800), raddr=('127.0.0.1', 57526)>
hi
>>>hi
<socket.socket fd=5, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8800), raddr=('127.0.0.1', 57580)>
hello
>>>hello

在第二次运行的客户端继续聊天

talk_client.py

/home/smoke/文档/DocumentFile/PycharmProjects/选课系统Demo/Jaime/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/io_multiplexing/talk_client.py
>>>hello
hello
>>>yes

talk_server.py

/home/smoke/文档/DocumentFile/PycharmProjects/选课系统Demo/Jaime/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/io_multiplexing/talk_server.py
<socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8800), raddr=('127.0.0.1', 57526)>
hi
>>>hi
<socket.socket fd=5, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8800), raddr=('127.0.0.1', 57580)>
hello
>>>hello
yes
>>>yes

在第一次运行的客户端继续聊天

talk_client.py

/home/smoke/文档/DocumentFile/PycharmProjects/选课系统Demo/Jaime/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/io_multiplexing/talk_client.py
>>>hi
hi
>>>o,y

talk_server.py

/home/smoke/文档/DocumentFile/PycharmProjects/选课系统Demo/Jaime/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/io_multiplexing/talk_server.py
<socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8800), raddr=('127.0.0.1', 57526)>
hi
>>>hi
<socket.socket fd=5, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8800), raddr=('127.0.0.1', 57580)>
hello
>>>hello
yes
>>>yes
o,y
>>>ok

在第一次运行的客户端继续聊天

talk_client.py

/home/smoke/文档/DocumentFile/PycharmProjects/选课系统Demo/Jaime/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/io_multiplexing/talk_client.py
>>>hi
hi
>>>o,y
ok
>>>aaa

在第二次运行的客户端继续聊天

talk_client.py

/home/smoke/文档/DocumentFile/PycharmProjects/选课系统Demo/Jaime/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/io_multiplexing/talk_client.py
>>>hello
hello
>>>yes
yes
>>>bbb

talk_server.py

/home/smoke/文档/DocumentFile/PycharmProjects/选课系统Demo/Jaime/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/io_multiplexing/talk_client.py
>>>hi
hi
>>>o,y
ok
>>>aaa

ccc
>>>

#!/usr/bin/env python3.8
# -*- coding: UTF-8 -*-
# __author: smoke
# file: talk_server
# time: 2021/06/17

import socket
import select

sk=socket.socket()

sk.bind(('127.0.0.1',8800))
sk.listen(3)

inp=[sk,]
while True:
    inputs,outputs,errors=select.select(inp,[],[],)
    for obj in inputs:    #[conn,]
        if obj==sk:
            conn,addr=sk.accept()
            print(conn)
            inp.append(conn)
        else:
            data=obj.recv(1024)
            print(data.decode('utf8'))
            Inputs = input('回答%s>>>' %inp.index(obj))
            obj.sendall(Inputs.encode('utf8'))

/home/smoke/文档/DocumentFile/PycharmProjects/选课系统Demo/Jaime/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/io_multiplexing/talk_server.py

运行第一个客户端

talk_client.py

#!/usr/bin/env python3.8
# -*- coding: UTF-8 -*-
# __author: smoke
# file: talk_client
# time: 2021/06/17

import time
import socket
sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sk.connect(('127.0.0.1', 8800))

while True:
    inp=input('>>>')
    sk.sendall(bytes(inp,"utf8"))
    data=sk.recv(1024)
    print(data.decode('utf8'))

/home/smoke/文档/DocumentFile/PycharmProjects/选课系统Demo/Jaime/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/io_multiplexing/talk_client.py
>>>

运行第二个客户端

talk_client.py

/home/smoke/文档/DocumentFile/PycharmProjects/选课系统Demo/Jaime/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/io_multiplexing/talk_client.py
>>>

在第一次运行的客户端继续聊天

talk_client.py

/home/smoke/文档/DocumentFile/PycharmProjects/选课系统Demo/Jaime/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/io_multiplexing/talk_client.py
>>>hi

talk_server.py

/home/smoke/文档/DocumentFile/PycharmProjects/选课系统Demo/Jaime/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/io_multiplexing/talk_server.py
<socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8800), raddr=('127.0.0.1', 39736)>
<socket.socket fd=5, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8800), raddr=('127.0.0.1', 39796)>
hi
回答1>>>hi,1

在第二次运行的客户端继续聊天

talk_client.py

/home/smoke/文档/DocumentFile/PycharmProjects/选课系统Demo/Jaime/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/io_multiplexing/talk_client.py
>>>hello

talk_server.py

/home/smoke/文档/DocumentFile/PycharmProjects/选课系统Demo/Jaime/venv/bin/python /home/smoke/文档/DocumentFile/PycharmProjects/pythonProject/io_multiplexing/talk_server.py
<socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8800), raddr=('127.0.0.1', 39736)>
<socket.socket fd=5, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8800), raddr=('127.0.0.1', 39796)>
hi
回答1>>>hi,1
hello
回答2>>>hello,2