🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
IPv4

IPv4(Internet Protocol version 4)は、インターネットプロトコルの一つ。インターネットに繋がったコンピューターや機器を識別するためのIPアドレスを32ビット表記で表わします。しかしIPv4は、限界があるため、IPv6が次世代プロトコルとして注目されています。

Python 3.x

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

ソケット

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

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Python

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

Q&A

解決済

2回答

14192閲覧

Pythonのtcp/ip通信で、2台のパソコンを通信させたい

okome_i

総合スコア1

IPv4

IPv4(Internet Protocol version 4)は、インターネットプロトコルの一つ。インターネットに繋がったコンピューターや機器を識別するためのIPアドレスを32ビット表記で表わします。しかしIPv4は、限界があるため、IPv6が次世代プロトコルとして注目されています。

Python 3.x

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

ソケット

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

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Python

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

0グッド

0クリップ

投稿2020/11/22 08:20

前提・実現したいこと

Pythonを用いて2台のパソコン間でTCP/IP通信を行いたい
(追加の質問:1台のパソコンで行ったとき、netstatで出てきたローカルアドレスがサーバ側なのか、クライアント側なのか知りたい)

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

以下の用にサーバのIPアドレスを打っても通信できません。

接続先サーバ:サーバのIPアドレスを打ちました 接続できません プロセスは終了コード 0 で完了しました

同じパソコン内で行うと通信できます

接続先サーバ:localhost メッセージを入力:Hello サーバからのメッセージ: 2020-11-22 17:19:18.560995 プロセスは終了コード 0 で完了しました

該当のソースコード1(server側)

Python

1# モジュールのインポート 2import socket 3import datetime 4 5 6# グローバル変数 7PORT = 50002 # ポート番号 8BUFSIZE = 4096 # 受信バッファの大きさ 9 10# メイン実行部 11# ソケットの作成 12server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 13# アドレスの設定 14server.bind(("",PORT)) 15# 接続の待ち受け 16server.listen() 17 18# クライアントへの対応処理 19while True: # 対応の繰り返し 20 client, addr = server.accept() # 通信用ソケットの取得 21 msg = str(datetime.datetime.now()) # メッセージの作成 22 print(msg,"接続要求あり") 23 print(client) 24 data = client.recv(BUFSIZE) # クライアントより受信 25 print(data.decode("UTF-8")) # 受信内容の出力 26 client.sendall(msg.encode("utf-8")) # メッセージの送信 27 client.close() # コネクションのクローズ

該当のソースコード2(client側)

Python

1# モジュールのインポート 2import socket 3import sys 4 5# グローバル変数 6PORT = 50002 # ポート番号 7BUFSIZE = 4096 # 受信バッファの大きさ 8 9# メイン実行部 10# ソケットの作成 11client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 12# サーバとの接続 13host = input("接続先サーバ:") 14try: 15 client.connect((host, PORT)) 16except: 17 print("接続できません") 18 sys.exit() 19# サーバへのメッセージの送信 20msg = input("メッセージを入力:") 21client.sendall(msg.encode("utf-8")) 22# サーバからのメッセージの受信 23data = client.recv(BUFSIZE) 24print("サーバからのメッセージ:") 25print(data.decode("UTF-8")) 26# コネクションのクローズ 27client.close()

試したこと

初めに同じパソコン内で試してみようと思い、クライアントのhostに"localhost"と入れて実行したところ通信できたが、その値を2台目のパソコンのIPアドレスにしたところできなかった。

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

Python 3.6
Anaconda3
PyCharm
Windows 10

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

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

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

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

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

bsdfan

2020/11/22 08:47

ファイアウォールでふさいでいたりしませんか?
dodox86

2020/11/22 08:55

> その値を2台目のパソコンのIPアドレスにしたところできなかった。 確認ですが、2台目のサーバーでサーバープログラムを走らせた上で、クライアント側のプログラムからはその2台目のサーバーのIPアドレスを指定するのが正しいですが、合っていますか?
okome_i

2020/11/22 08:57

はい。クライアント側で入力したIPアドレスはサーバ側のIPアドレスです。 ファイアウォールに関しては、確認できるのが明日になってしまうのですが確認してみます。
fumu7

2020/11/22 08:57

Qiitaの [pythonでsocket通信を勉強しよう](https://qiita.com/__init__/items/5c89fa5b37b8c5ed32a4) の記事が参考になるのでは? 「以下の用にサーバのIPアドレスを打っても通信できません」の、以下の様に、がどんな操作を意味するのかが判りません。説明は、具体的に詳しくしてください。 質問のプログラム(サーバ側)の問題点は、bindでIPアドレスを指定していない事のように思われます。
okome_i

2020/11/22 09:01 編集

IPアドレス自体を載せるのは、載せて大丈夫なものかわからず載せていませんでした。すみません。 bindのアドレス欄には、127.0.0.1や0.0.0.0、 サーバ側のIPアドレス(クライアント側で入力したのと同じ値)も試したのですがうまくいきませんでした。
dodox86

2020/11/22 09:03

>@fumu7さん > bindでIPアドレスを指定していない事のように思われます。 そこは私も疑ったのですが、AF_INETだとご提示のコードではINADDR_ANY(0.0.0.0)相当になるので、恐らく大丈夫なのかと思われます。 https://docs.python.org/ja/3.7/library/socket.html?highlight=bind#socket.socket.bind > For IPv4 addresses, two special forms are accepted instead of a host address: '' represents INADDR_ANY, which is used to bind to all interfaces, 念の為、指定してみるのと、ご使用のPython3のバージョンの詳細を明示した方が良いかと思います。
okome_i

2020/11/22 09:08

IPアドレスは指定したのも行いましたがダメでした。 Python3は3.6.12です
dodox86

2020/11/22 09:11

サーバーのTCPポート番号は50002を指定されていてWellknownポート範囲外なので、Windows10では通常の設定でのファイアウォールで閉じられるものではないはずですが、既に他回答者さんより指摘されているように、確認した方が良いですね。
okome_i

2020/11/22 09:12

分かりました。 明日確認してみます。
dodox86

2020/11/22 09:15

私の方で確認した限りでは、Windows10 WSL/Ubuntu Python3.6.9上で、ご提示のサーバープログラムを修正せずに走らせたところ、同じサブネット内のリモートマシンからクライアントとして接続できました。ただし、クライアントプログラムの方は試していません。(ncコマンドで接続できることを確認したのみ)
okome_i

2020/11/22 09:24

それって自分が同じPC内でサーバとクライアントを作り、通信を行うことができた状況と同じですよね? コードが合ってるとなると何が原因なのか難しいです。
dodox86

2020/11/22 09:27

> それって自分が同じPC内でサーバとクライアントを作り、通信を行うことができた状況と同じですよね? いえ、違います。リモートマシンと書いているように、別PCです。
okome_i

2020/11/22 09:35

ちなみにクライアントのプログラムを実行しないで接続できるものなのですか? まだ初心者なので何もわからずすみません。
dodox86

2020/11/22 09:42

> ちなみにクライアントのプログラムを実行しないで接続できるものなのですか? 言い方の問題ですが、TCPのクライアントプログラムがサーバーに接続するわけなので、TCPクライアントとしての挙動をするプログラムを使えば良いのです。例えばwget、curl、ncコマンドなど。TCPポート番号を合わせれば、何はともあれ繋がります。極端な話、chromeなどのWEBブラウザでもアドレスバーに「http://サーバーのアドレス:50002/」と入力して実行すればサーバーにconnectし、HTTPリクエストをサーバー側に送信します。サーバー側はそれを処理するはずです。 その辺りの関係を基本的にでも分かっていないと、問題解決も遠のきます。(TCPクライアントのプログラム自体にバグがあったら、手も足もでなくなっちゃいますよね?)
okome_i

2020/11/22 09:48

確かに、勉強になります。 とりあえず明日ファイアウォールの確認してみます。
okome_i

2020/11/23 04:19

ESETファイアウォールを解除したらできました。 ありがとうございます。
guest

回答2

0

ベストアンサー

①もし、2台のPCを直接LANケーブルで繋いでいるのであれば、クロスケーブルが必要です。家に転がってるのは、ほぼほぼストレートケーブルなので、家に転がっているやつを使ってPC2台を直接繋ぐとかなりの確率で通信ができません。クロスケーブルをヤマダ電機に買いに行ってください。

②買ってきたら以下のURLを参考に2台のPCのIPを設定してください。http://qa.elecom.co.jp/sp/faq_detail.html?id=5089
これで通信できるようになると思います。

③wifiの場合は、PC2台がネットワーク的に繋がっているか、確認してください。
Windows10の場合は、ファイアウォールの設定を変えなければpingの疎通ができないです。
https://n-archives.net/software/nwol/articles/how-to-allow-ping-response-in-windows10/

元イソフラエンヅニアより。。。

投稿2020/11/22 16:19

ponsuke88

総合スコア12

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

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

okome_i

2020/11/23 04:18

ESETファイアウォールを解除したらできました。 ありがとうございます。
guest

0

Qiitaの pythonでsocket通信を勉強しよう の記事が参考になるのでは?

「以下の用にサーバのIPアドレスを打っても通信できません」の、以下の様に、がどんな操作を意味するのかが判りません。説明は、具体的に詳しくしてください。

質問のプログラム(サーバ側)の問題点は、bindでIPアドレスを指定していない事のように思われます。

投稿2020/11/22 13:48

fumu7

総合スコア121

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

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

okome_i

2020/11/22 14:06

上記と同じこと書いてませんか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問