Pythonは同時実行性の高いGPRSテストサーバーを作成します

会社の機器はGPRSテストを行う必要があります

テスト時にサーバー側の時間をデバイスに書き込みます

このようにして、GPRSの機能がテストされ、2番目は最新の時刻をデバイスに同期することです。

もちろん、デバイス側はクライアント側なので、高い同時実行性をサポートするサーバー側を作成する必要があります

asyncioが優れたライブラリであることを確認しましたが、これは私には必要ありません(正確には、使用方法がわかりません)

したがって、セレクターを使用して、高い同時実行性をサポートする単純なサーバーを作成します

インターネット上のほとんどの例と同じように、以下の私のコードを読んだら、醜さを示してください

もちろん、インターフェースは以下に書く必要があります。どのコンピューターに配置されていてもサーバー側がサポートできるようになれば、インターフェース側は本日終了します。

最初に件名を書き留めます


'''
GPRS test server
'''
import selectors
import socket
from datetime import datetime

sel = selectors.DefaultSelector()

'''
accept在外部socket连接进来也就是收到EVENT_READ消息时候调用到
sock.accpet会获取到连接进来的套接字以及地址
这里的conn套接字和外面的socket套接字不是一个概念
这个套接字是用来传输数据用的,当然连接进来的套接字也要设置为非阻塞的
因为要在这里也实现异步操作,这里就是异步的读取
这里也将对应的读取函数注册到这个套接字上,
所以在读取的时候就会将要读取的内容从对应的套接字上接收回来
当然看到下面的read函数,在读取之后再反馈给对应的套接字一个字符串
最后再关闭这次连接
'''
def accept(sock,mask):
    conn,addr = sock.accept()
    print('accepted',conn,'from',addr)
    conn.setblocking(False)
    sel.register(conn,selectors.EVENT_READ,read)


def get_send_data_ready(recvdata):
    char_pos = recvdata.find("##");
    if char_pos == -1:
        return "illegal string"
    send_data = recvdata[0:char_pos + 2] + "UTCtime:";
    print(send_data)

    now = datetime.now()
    print('data time now:')
    print(now)

    now_utc_time = ((str)((int)((datetime.now()).timestamp())))
    print(now_utc_time)
    send_data += now_utc_time;

    return send_data

def read(conn,mask):
    data = conn.recv(100).decode('utf-8')
    if data:
        #print('echoing',repr(data),'to',conn)
        print("receive data = %s"%data)
        send_data = get_send_data_ready(data)
        print("send_data = %s"%send_data)
        conn.send(send_data.encode('utf-8'))
    else:
        #print('closeing',conn)
        print("close socket")
        sel.unregister(conn)
        conn.close()

sock = socket.socket()
sock.bind(('',1544))
sock.listen(1000)
sock.setblocking(False)
'''一旦在sock上有READ事件就调用accept函数'''
sel.register(sock,selectors.EVENT_READ,accept)

def loop():
    while True:
        events = sel.select()
        #print(type(events))
        #print(events)
        '''
        Here events is a list type.In events it can include many events,
        every event include a iterator.you can print it 
        '''
        print('events lenght = %d'%len(events))

        for key,mask in events:
            callback = key.data
            callback(key.fileobj,mask)

if __name__ == '__main__':
    loop()

ここでは、USR-TCP232-Test-V1.3.exeテストプログラムを使用して同時実行性をテストします

このUSR-TCP232-Test-V1.3.exeでは、データを周期的に送信するように設定されており、1ミリ秒ごとにデータを送信するとevents = sel.select()が表示されます。

このイベント(リストタイプ)の長さは2で、同時実行が発生します。これは、同時実行を明確に反映できます。

これがここでのforループの役割です

私の小さな白、言語は単純で、省略することは避けられません、私を訂正してください!

おすすめ

転載: blog.csdn.net/yangkunhenry/article/details/100698678