Python de socket(3)

クライアントもノンブロッキング

ということで、クライアント側のノンブロッキングなのですが、
実は、サーバ側とたいしてかわらないわけです。
で、こんな感じ。

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かなー

つづく

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です