python的select服务端的代码和客户端的代码

服务端的代码

import socket
import queue
import select
ip_bind = ("127.0.0.1",9000)

message_queue = {}
#保存客户端发送过来的信息,将消息放入到队列中

input_list = []

output_list = []

if __name__ == ‘__main__‘:
    server = socket.socket()
    server.bind(ip_bind)
    server.listen(10)
    server.setblocking(False)
    #设置socket服务端为非阻塞的

    input_list.append(server)
    #初始化将服务端加入到监听列表中

    while True:
        print("waiting for new connection")
        stdinput,stdoutput,stderr = select.select(input_list,output_list,input_list,2)
        #开始select监听,对input_list中的服务端server进行监听

        for obj in stdinput:
            #判断是否有客户端连接进来,当有客户端连接进来时select将触发,就会进入循环

            if obj == server:  #代表一个新的连接进来
                #判断当前触发的是不是服务端的对象,当触发的对象是服务端的对象时候,说明
                #有新的客户端连接进来了

                conn,addr = server.accept()
                print("Client {0} is connected".format(addr))
                conn.setblocking(False)
                #把这个新连接的实例设置为非阻塞

                #这个时候我们不能立即接受数据,因为在select中,是单线程的,如果这里直接开始接受数据,那么其他的客户端就无法连接进来了,所以只能
                #先把这个链接存起来,放到一个input_list中,为什么放到input_list中呢,因为我们想监控这个链接,如果这个客户端有消息过来,那么select
                #就会触发,如果没有数据返回,则select就不会被触发

                input_list.append(conn)
                #将和这个客户端的连接的服务端的实例也加入到监听列表中,当客户端发送消息的
                #时候,select就会被触发

                message_queue[conn] = queue.Queue()
                #为这个连接的客户端单独创建一个独一无二的消息队列,用来保存客户端发送的消息。

            else:  #代表一个有数据的链接进来了,这个时候我就可以开始收数据了

                #由于客户端连接进来时服务端接受客户端的连接请求,将这个客户端的服务端的
                #也加入到监听列表中,这个客户端如果发送消息,则会触发select
                try:
                    recv_data = obj.recv(1024)
                    if recv_data:
                        #客户端未断开
                        print("received {0} from client {1}".format(str(recv_data,encoding="utf-8"),addr))

                        #将收到的信息放入该客户端的队列中
                        message_queue[obj].put(recv_data)

                        #此时也不能直接给客户端返回数据,因为一旦返回数据,就又可能造成阻塞,所有将回复操作放到output列表中,让select监听
                        if obj not in output_list:
                            output_list.append(obj)

                except ConnectionResetError:
                    input_list.remove(obj)
                    del message_queue[obj]
                    print("client {0} is disconnected".format(addr))

        for sendobj in stdoutput: #这里处理的是返回的消息,output_list是我们自己维护的,我们自己往里面放数据
            try:
                if not message_queue[sendobj].empty():
                #如果消息队列中有消息,从消息队列中获取要发送的消息
                    send_data = message_queue[sendobj].get()
                    #从该客户端对象的消息队列中获取消息
                    sendobj.sendall(send_data)
                else:
                    output_list.remove(sendobj)
                    #将监听移除等待瞎猜疑客户端发送消息
            except ConnectionResetError:
                #客户端连接断开
                del  message_queue[sendobj]
                output_list.remove(sendobj)
                print("Client {0} disconnected".format(addr))

        for obj in stderr:  #如果出错的处理
            # print()
            input_list.remove(obj)
            if obj in output_list:
                output_list.remove(obj)
            obj.close()
            del message_queue[obj]

  

时间: 2024-12-19 08:52:46

python的select服务端的代码和客户端的代码的相关文章

python的flex服务端数据接口开发

python的flex服务端数据接口开发 python 如果给flex提供服务端,需要提供一个网关和一个可供客户端(flex)调用的类.这方面我更加推荐用twisted来写这个网关,因为twisted有很好的异步机制. 下面的我写的一个简单的验证用户的python服务端: ______________________________DBServer.py # Copyright (c) 2009-2010 The Newjh Project."""@author: Roy@s

python 模拟HTTP服务端

使用python模拟http服务端,自定义返回信息头部: #!/usr/bin/python import os from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer Host = '' Port = 8080 class RequestHandler(BaseHTTPRequestHandler):         def do_GET(self):                 Time = os.popen('date 

CentOS Rsync服务端与Windows cwRsync客户端实现数据同步

CentOS Rsync服务端与Windows cwRsync客户端实现数据同步 2012年05月06日 ? Rsync ? 暂无评论 ? 被围观 3,622次+ 说明: 1.Rsync服务端 系统:CentOS 5.5 IP地址:192.168.21.160 数据存放目录:/data/osyunwei 2.cwRsync客户端 系统:Windows Server 2003 IP地址:192.168.21.130 同步的目录:D:\osyunwei 实现目的: cwRsync客户端每天凌晨3:0

FireFly 服务端 Unity3D黑暗世界 客户端 问题

启动服务端成功截图: 连接成功截图: 测试服务端是否启动成功: 在Web输入:http://localhost:11009/  按回车 (查看cmd启动的服务端 是否多出如下显示) 服务端启动成功.PC unity3d客户端 连接也成功.但在手机端连接不成功 一直显示连接服务器有误 请检查网络 --------- beginning of /dev/log/system--------- beginning of /dev/log/mainD/Unity (32743): GL_EXT_debu

socket服务端处理多个客户端的请求学习理解

socket服务端处理多个客户端的请求:while(true){Socket s=ss.accept();new WorkThread(s).start();}class WorkThread edtends Thread{private Socket s;public WorkThread(Socket s){this.s=s;}public void run(){s.getInput();s.getOutput();}}

WebService服务端获取访问的客户端IP

WebService服务端获取 访问的客户端IP: @WebService(serviceName = "XXXService", targetNamespace ="http://ws.sms.zjapl.com") public class XXXWebServiceImpl implements XXXWebService { @Resource(name ="org.apache.cxf.jaxws.context.WebServiceContex

thrift 服务端linux C ++ 与客户端 windows python 环境配置(thrift 自带tutorial为例)

关于Thrift文档化的确是做的不好.摸索了很久才终于把跨linux与windows跨C++与python语言的配置成功完成.以下是步骤: 1)                 Linux下环境配置 l  完成thrift所依赖的其他软件包的安装:Boost.libtool.libevent.bison.flex 解压boost_1_55_0,进入boost_1_55_0目录下 chmod 777 bootstrap.sh chmod 777 ./tools/build/v2/engine/bu

C# WebSocket 服务端示例代码 + HTML5客户端示例代码

WebSocket服务端 C#示例代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.Net; using System.Threading; using System.Text.RegularExpressions; using System.Security.Cryptography; na

Pywss - 用python实现WebSocket服务端

一种类似Flask开发的WebSocket-Server服务端框架,适用python3.X 1.安装模块Pywss pip install pywss 2.搭建简易服务器 2.1 服务端代码 代码简介 route: 注册请求路径 example_1(request, data): request: socket句柄,能够发送和接收数据接.发送数据request.ws.send(data),收数据request.ws_recv(1024) data: 客户端发送的数据存于此处 from pywss