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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

ソケット

TCP/IPにおいて、IPアドレスとサブアドレスであるポート番号を組み合わせたネットワークアドレスのことを呼びます。また、ソフトウェアアプリケーションにおいて、TCP/IP通信を行う為の仮想的なインターフェースという意味もある。

Q&A

2回答

2744閲覧

ソケット通信で接続することができない

kook

総合スコア11

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

ソケット

TCP/IPにおいて、IPアドレスとサブアドレスであるポート番号を組み合わせたネットワークアドレスのことを呼びます。また、ソフトウェアアプリケーションにおいて、TCP/IP通信を行う為の仮想的なインターフェースという意味もある。

0グッド

0クリップ

投稿2018/12/20 13:53

編集2022/01/12 10:55

前提・実現したいこと

Pythonでソケット通信を行うプログラムを作っています。
ソケットを通じてメッセージを受け取りその内容を表示することを目指しています。
接続先には自PCを指定しています。

至らない点がありましたらご指摘いただけると幸いです。
よろしくお願い致します。

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

ソケットを通じてメッセージを受け取ろうとしても接続待ちになってしまいます。

コンソールには以下が表示されます。(追記)

my ip address is now ... (IPアドレス) Waiting for the connection ...

プログラムの実行を止めると以下のエラーが表示されます。

KeyboardInterrupt

該当のソースコード

python

1<?python 2#server.py 3from concurrent.futures import ThreadPoolExecutor 4import socket 5import os 6 7 8def __handle_message(args_tuple): 9 10 conn, addr, data_sum = args_tuple 11 while True: 12 data = conn.recv(1024) 13 data_sum = data_sum + data.decode('utf-8') 14 15 if not data: 16 break 17 18 if data_sum != '': 19 print(data_sum) 20 21 22def __get_myip(): 23 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 24 s.connect(('8.8.8.8', 80)) 25 return s.getsockname()[0] 26 27 28def main(): 29 30 # AF_INET : IPv4ベースのアドレス体系を使う 31 # SOCK_STREAM : TCP/IPを使う 32 my_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 33 34 # 多重接続になってもいいようにスレッドで処理する 35 executor = ThreadPoolExecutor(max_workers=os.cpu_count()) 36 37 # 開くポート番号は適当に選ぶ 38 myhost = __get_myip() 39 print('my ip address is now ...', myhost) 40 my_socket.bind((myhost, 50030)) 41 42 # 同時に接続する相手の数。今回は1 43 my_socket.listen(1) 44 45 try: 46 while True: 47 48 # 接続があるまで待機 49 print('Waiting for the connection ...') 50 conn, addr = my_socket.accept() 51 print('Connected by ...', addr) 52 data_sum = '' 53 executor(__handle_message, (conn, addr, data_sum)) 54 55 except KeyboardInterrupt: 56 print('done') 57 58 59if __name__ == '__main__': 60 main() 61 62 63#client.py 64import socket 65 66my_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 67my_socket.connect(('自PCのIPアドレス', 50030)) 68my_text = "Hello! This is test message from my sample client!" 69my_socket.sendall(my_text.encode('utf-8')) 70 71>

試したこと

デバッグを行うとaccept()で問題になっていることがわかりました。

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

OS:mac
Python:3.7.0
IDE:Pycharm

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

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

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

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

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

hayataka2049

2018/12/20 13:55

インデントが潰れたりしてコードが読めないので、https://teratail.com/tour を参考にコード部分をシンタックスハイライト・マークダウンで囲ってください
y_waiwai

2018/12/20 14:00

質門を編集し、<code>ボタンで、出てくる’’’の枠の中にコードを貼り付けてください
kook

2018/12/20 14:11

ご指摘ありがとうございます。 リンクを参考に記法で書き直しました。 よろしくお願い致します。
guest

回答2

0

以下、executorにてエラー発生します。当方では以下の修正で動作しました。
参考:Pythonの並列・並行処理サンプルコードまとめ

Python

1 # 接続があるまで待機 2 print('Waiting for the connection ...') 3 conn, addr = my_socket.accept() 4 print('Connected by ...', addr) 5 data_sum = '' 6 #executor(__handle_message, (conn, addr, data_sum)) # TypeError: 'ThreadPoolExecutor' object is not callable 7 executor.submit(__handle_message, (conn, addr, data_sum))

投稿2018/12/20 14:50

can110

総合スコア38233

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

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

kook

2018/12/20 14:54

回答ありがとうございます。 明日確認させていただきます。
kook

2018/12/21 15:54

修正して実行しましたが、接続待ちのままでした。 また、質問に情報が不足しており追記しましたが、こちらではexecutor まで処理が進んでいない状況です。
can110

2018/12/21 16:42

サーバ、クライアントのIPアドレス部分をローカル・ループバック・アドレス'127.0.0.1'に置き換えた場合にはどうなりますか? ちなみに当方環境では__get_myip()の戻り値が'192.168.1.2'などで、クライアントでもこれを指定して正常に動作しています。
guest

0

__get_myipってのがちと意味不明ですが、これでなにが帰ってきます?

投稿2018/12/20 14:13

編集2018/12/20 14:13
y_waiwai

総合スコア87719

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

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

kook

2018/12/20 14:28

自PCのIPアドレスが帰ってきます。
y_waiwai

2018/12/20 14:31

具体的になにが帰りますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問