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

そう、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)
あとは、クラスにして、云々というのはあるけれど、
どうせスレッドがどうしたとかやり始めるので、クラスはその時にしよう。