Python de socket(3)
2020-07-07
クライアントもノンブロッキング
ということで、クライアント側のノンブロッキングなのですが、
実は、サーバ側とたいしてかわらないわけです。
で、こんな感じ。
def CLtest():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_SNDBUF,80)
s.setsockopt(socket.SOL_SOCKET,socket.SO_RCVBUF,80)
s.setblocking(False)
#-------------------------------------
print("●開始します")
#-------------------------------------
print("●connectします")
a = 123456
while(True):
try:
a = s.connect(('127.0.0.1',60009))
except Exception as e:
en = e.args[0]
print("●en:",en)
if en == 10056: #既に接続
break
if en == 10035:
print("●10035")
#time.sleep(0.1)
time.sleep(0.01)
continue
elif en == 11:
print("●11")
time.sleep(0.01)
continue
break
time.sleep(0.01)
print("●connect:",a)
#-------------------------------------
print("●sendします")
moji = b"ZZ123"
print("send@",moji)
while(True):
try:
a = s.send(moji)
break
except Exception as e:
en = e.args[0]
print("●en:",en)
#if en == 10056: #既にCLOSE
time.sleep(1)
print("●send:",a)
a = s.send(b"*****QQQQ")
print("●send2:",a)
#-------------------------------------
print("●recvします")
while(True):
try:
a = s.recv(10)
break
except Exception as e:
en = e.args[0]
print("●en:",en)
#if en == 10056: #既にCLOSE
time.sleep(1)
print("●a:",a)
#-------------------------------------
print("●closeします")
s.close()
#-------------------------------------
print("●10秒後に終了")
time.sleep(10)
s.close()
テストも別々にするとめんどいので、ここだけ関数にして、別スレッドか別プロセスで呼ぶようにしてテストしました。
↓こういうことです。
#p = multiprocessing.Process(target = CLtest)
p = threading.Thread(target = CLtest)
p.start()
で、結果。
Windows
〇accept開始
●開始します
●connectします
●en: 10035
●10035
〇recv
●en: 10056
●connect: 123456
●sendします
send@ b'ZZ123'
〇dat b'ZZ12'
〇dat b'3'
recV: b'ZZ123'
〇send
●send: 5
send bytes: 12
●send2: 9
●recvします
●a: b'I am Hirai'
●closeします
〇10秒後に終了
●10秒後に終了
Linux
〇accept開始
●開始します
●connectします
●en: 115
●connect: 123456
●sendします
send@ b'ZZ123'
●send: 5
●send2: 9
●recvします
●en: 11
〇recv
〇dat b'ZZ12'
〇dat b'3***'
〇dat b'**QQ'
〇dat b'QQ'
recV: b'ZZ123*****QQQQ'
〇send
send bytes: 12
〇10秒後に終了
●a: b'I am Hirai'
●closeします
●10秒後に終了
ほとんど一緒です。
途中、例外の時のsocketのエラーコードが違うくらいですかねー。
あー、でも115番、拾ってなかったですね。(>_<)
ということで
サーバの時とたいして変わんない内容ですみません^^;
次は気が向いたら、selectかなー
つづく