明日のためのプログラムその6。Pythonことはじめ。の3

そう、socketである。
なぜ?とかじゃなくて、私にとってsocketは、non-blockingである。
そういえば最初に書いたプログラムはblockingだった。
検索してみると、当然ながら、次のサンプルが。

	s.setblocking(False)

そう、そして、テストしてみる。

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
	s.bind(('127.0.0.1', 12345))
	s.listen(10)
	s.setblocking(False)
	while True:
		print("--- 1 ---")
		conn, addr = s.accept()
		print("--- 2 ---")

で、当然、こうなる!

--- 1 ---
Traceback (most recent call last):
  File "Z07_blog_socksv.py", line 71, in <module>
    conn, addr = s.accept()
  File "D:\PData\Anaconda3\lib\socket.py", line 212, in accept
    fd, addr = self._accept()
BlockingIOError: [WinError 10035] ブロック不可のソケット操作をすぐに完了できませんでした。

まぁ、そりゃそうだ。
私のソースコードフォルダを”10035″でぐぐれば、とうぜん大量にでてくる。
そう、いつものあれ。
じゃぁどうすりゃいいかっていうと、エラーじゃなくて、例外らしいので。

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
	s.bind(('127.0.0.1', 12345))
	s.listen(10)
	s.setblocking(False)
	while True:
		print("--- 1 ---")
		try:
			conn, addr = s.accept()
		except Exception as e:
			print(e)
			break;
		print("--- 2 ---")

そうして、、どうなるかというと、当然のようにこうなる。

--- 1 ---
[WinError 10035] ブロック不可のソケット操作をすぐに完了できませんでした。

じゃぁどうすかっていうと、exceptionのargsを見ればいいらしい。

print(e.args)

すると、こうなる。

--- 1 ---
(10035, 'ブロック不可のソケット操作をすぐに完了できませんでした。', None, 10035, None)

だからこうしてみる。

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
	s.bind(('127.0.0.1', 12345))
	s.listen(10)
	s.setblocking(False)
	while True:
		print("--- 1 ---")
		try:
			conn, addr = s.accept()
		except Exception as e:
			if e.args[0]==10035:
				print("10035 ERROR")
				break;
		print("--- 2 ---")

とうぜんこうなる。

--- 1 ---
10035 ERROR

そこでこうしてみる。

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
	s.bind(('127.0.0.1', 12345))
	s.listen(10)
	s.setblocking(False)
	while True:
		print("--- 1 ---")
		try:
			conn, addr = s.accept()
		except Exception as e:
			if e.args[0]==10035:
				print("10035 ERROR")
				time.sleep(1)
				print("--- 2 ---")
				continue

で、こうなる

— 1 —
10035 ERROR
— 2 —
— 1 —
10035 ERROR
— 2 —
— 1 —
10035 ERROR
— 2 —
— 1 —
10035 ERROR
— 2 —
— 1 —
10035 ERROR
つづく(o^^o)

あとは、クラスにして、云々というのはあるけれど、
どうせスレッドがどうしたとかやり始めるので、クラスはその時にしよう。

コメントする

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