会社の機器は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ループの役割です
私の小さな白、言語は単純で、省略することは避けられません、私を訂正してください!