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

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

新規登録して質問してみよう
ただいま回答率
87.20%
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による文字列操作をサポートしているため、日本語処理も標準で可能です。

解決済

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

okome_i
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による文字列操作をサポートしているため、日本語処理も標準で可能です。

2回答

0評価

0クリップ

6646閲覧

投稿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

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

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

Python

# モジュールのインポート import socket import sys # グローバル変数 PORT = 50002 # ポート番号 BUFSIZE = 4096 # 受信バッファの大きさ # メイン実行部 # ソケットの作成 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # サーバとの接続 host = input("接続先サーバ:") try: client.connect((host, PORT)) except: print("接続できません") sys.exit() # サーバへのメッセージの送信 msg = input("メッセージを入力:") client.sendall(msg.encode("utf-8")) # サーバからのメッセージの受信 data = client.recv(BUFSIZE) print("サーバからのメッセージ:") print(data.decode("UTF-8")) # コネクションのクローズ client.close()

試したこと

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

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

Python 3.6
Anaconda3
PyCharm
Windows 10

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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ファイアウォールを解除したらできました。 ありがとうございます。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

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による文字列操作をサポートしているため、日本語処理も標準で可能です。