select模块异步通信

一、服务器

1.创建服务器的套接字,绑定服务器的地址接口
2.进行服务器的监听
3.使用select模块的方法对指定的文件描述符进行监听。
开始:select有三个参数,等待输入,输出和错误的文件描述符,我们把服务器 的套接字加到inputs列表,把inputs列表给select,select对inputs中的套接字进行监听
结果:当select监听到有输入的时候,就会返回一个元组,元组的内容就是三个参数中已经准备号的文件描述符。当有新连接来的时候会返回服务器本身的文件描述符,当是客户端传送数据的时候会返回客户端的文件描述符
4.判断是否是新连接
是 的话则把客户端的套接字添加到inputs中,让select进行监听
否 的话那么是客户端传数据来了
5.获取数据,判断是否有数据
有数据的话,则打印这个数据 并且传送数据给客户端
没有数据的话则说明连接已经断开,把这个客户端的套接字从inputs中移出去

import socket,select

s=socket.socket()
host=socket.gethostname()    #获得本机的主机名
port=1234      #端口
s.bind((host,port))      #绑定套接字接口地址
s.listen(5)      #开始服务器的监听
print(s)       #服务器的套接字地址

inputs=[s]

while True:
    rs,ws,es=select.select(inputs,[],[])   # select方法是对指定的文件描述符进行监视,并在文件描述符集改变的时候做出响应,三个必选参数
                                            #等待输入、输出和错误的文件描述符
    print('这是监听输入打印结果:',rs)
    for r in rs:         #select方法返回一个有3个列表值组成的元组,即为前3个参数中已经准备好的文件描述符
        if r is s:     #如果返回的输入列表的值是服务器的值,说明有新连接进来
            c,addr=s.accept()      #服务器端使用accept开始连接客户端
            print(c,'---',addr)     #返回的是客户端的套接字和客户端的地址
            print('Get connection from ',addr)
            inputs.append(c)      #把新连接到的这个客户端的套接字接口地址加到select监听的等待输入列表中,等待客户端传送数据

        else:  #说明是客户端在传送数据
            try:
                data=r.recv(1024)  #接收客户端的数据
                disconnected = not  data
                if disconnected:  #如果没有数据,说明客户端已经断开连接了
                    print(r.getpeername(),'disconnected')    #r.getpeername()是获取连接的客户端的接口地址
                    inputs.remove(r)   #把这个客户端从select监听的输入列表中移除
                else:
                    print(data)     #如果有数据过来的话,打印这个数据
                    datas=bytes(input('请输入服务器要返回给客户端的数据:'),encoding='utf-8')
                    r.send(datas)
            except Exception:
                inputs.remove(r)     #报出异常的话也删除这个客户端连接

二、客户端

1.创建套接字
2.连接服务器,需要提供服务器的地址接口
3.传送数据
4.接收数据
5.关闭客户端

from socket import socket
from socket import gethostname

Host=gethostname()  #获取服务器的主机,因为我是在本机运行的,所以可以用这个
port=1234
ADDR=(Host,port)

s=socket()
s.connect(ADDR)

while True:
    data=bytes(input('请输入你要传给服务器的内容:'),encoding='utf-8')  #python3.x已经删除了raw_input
    if  not data:
        break
    s.send(data)  # send只能传送bytes的数据
    print(s.recv(1024))
s.close()

三、运行

1.先运行服务器
2.运行客户端
3.输入要发送给服务器的内容
4.输入要返回给客户端的内容
服务器
在这里插入图片描述
客户端:
在这里插入图片描述

注意事项:
1.当导入的模块的时候是import socket
那么在创建 套接字的时候就要使用socket.socket()
当导入模块的时候是from socket import socket
那么在创建套接字的时候要使用socket()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值