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