質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

8298閲覧

python socket通信のエラー

takaZ

総合スコア1

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/05/04 08:40

前提・実現したいこと

回答よろしくお願いします。
現在pythonにてsocketを使用し、現在時を表示するプログラムを書いています。
そのプログラムをターミナルで実行する際に、下記のようなエラーメッセージが出てしまいます。
エラーの出力をなくすにはどうしたらよいでしょうか。

発生している問題・エラーメッセージ

Starting the client at 2020-05-04 17:13:41.100573 Client read b'2020-05-04 08:13:46.100692' Traceback (most recent call last): File "knock_client.py", line 12, in <module> client.sendto(b'time', address) OSError: [WinError 10038] ソケット以外のものに対して操作を実 行しようとしました。

該当のソースコード

python

1<server> 2from datetime import datetime 3import socket 4 5address = ('127.0.0.1', 50000) 6max_size = 4096 7 8print('Starting the server at', datetime.now()) 9print('Waiting for a client to call.') 10server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 11server.bind(address) 12while True: 13 data, client_addr = server.recvfrom(max_size) 14 if data == b'time': 15 now = str(datetime.utcnow()) 16 data = now.encode('utf-8') 17 server.sendto(data, client_addr) 18 print('Server sent', data) 19server.close() 20 21<client> 22import socket 23from datetime import datetime 24from time import sleep 25 26address = ('127.0.0.1', 50000) 27max_size = 4096 28 29print('Starting the client at', datetime.now()) 30client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 31while True: 32 sleep(5) 33 client.sendto(b'time', address) 34 data, server_addr = client.recvfrom(max_size) 35 print('Client read', data) 36 client.close() 37

試したこと

アドレス部分をlocalhostに変えてみたりしたのですが、やはりエラーが出力されます。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ロジックを全部追ってはいませんが、clientの無限ループの最後にclient.close()があって、2週目以降でsocketが閉じてしまっているのが気になります。

投稿2020/05/04 10:13

TakaiY

総合スコア12765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takaZ

2020/05/04 13:14

なるほど!closeを消したら参考書通りにプログラムが起動しました!ありがとうございます!
guest

0

ベストアンサー

ループして何をしたいのかよく分かりませんが、ループの中の最後でcloseしているので2回目の実行の時にはエラーになって当然だと思います。

繰り返し実行したいなら、closeはループし終わってからにすべきだし(そうすると無限ループ?)
一度だけの実行でいいなら、whileをやめれば良い。

投稿2020/05/04 10:09

otn

総合スコア84557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takaZ

2020/05/04 13:16

ご指摘の通りに修正したら参考書通りにプログラミングが起動しました!あがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問