LoginSignup
0
0

More than 3 years have passed since last update.

Python3 Socket通信でエラーがでるときのメモ

Last updated at Posted at 2021-03-08

2020.03.08

Python3
Socket通信

本の通りにclient.pyとserver.pyを書いてソケット通信を試みようとした
ところエラーが出て通信できなかった時のメモ。

●サーバ環境
 さくらVPS 3GB 100GB SSH
 Ubuntu 20.04LTS
 Python3.8.5
 server.py を設置して稼働する

●クライアント環境 (自宅)
 Windows10 Home
 Visual Studio Code
 Python3.9.1(Windows版)
 Rlogin
 client.py を設置して実行する(上記server.py稼働中に実行する)

Ubuntuでのポート開放方法がわからない方は
参考:ufwコマンドの使い方
などをご参照ください。

●ポート番号が悪さをしている可能性
古い本の中にはソケット通信のポート番号として、ウェルノウンポート番号や登録済み
ポート番号を指定しているものが多い(8000番とか、8001番とか)が、これを動的・
プライベートポート番号に変更
するだけでプログラムが正常に稼働し、通信できた。

通信エラーがでる人はプログラムで利用するポート番号を確認してほしい。

client.py
# 2021.03.08
# ソケット通信テストプログラム
# ポートは動的・プライベートポート番号(49152-65535)を利用しないと
# つながらない!本などで8000番,8001番などを利用しているものが
# 多いので注意する。

import socket

def socketConnectClient():
    PORT=49200 #動的・プライベートポート番号(49152-65535)を利用すること
    SERVER='honyarara.com' #接続先のドメインかIPアドレス
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((SERVER, PORT))  # サーバを指定して接続
        # s.connect((SERVER,8002)) # 仮にポート開けててもソケット通信不可!
        s.sendall(b'Hello!')       # サーバにメッセージを送る
        data = s.recv(1024)        # サーバからの文字列を取得する
        print(repr(data))

if __name__ =='__main__':
    socketConnectClient()
server.py
# 2021.03.08
# socket サーバを作成
# Ctrl+Cで中断終了してください

import socket

SERVER=''  #サーバー側は空欄でよい
PORT=49200 #動的・プライベートポート番号(49152-65535)を利用すること
def socketConnectServer():
    print("ポート番号:{}でソケット通信を開始します。".format(PORT))
    # AF = IPv4 という意味
    # TCP/IP の場合は、SOCK_STREAM を使う
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        # IPアドレスとポートを指定
        s.bind((SERVER,PORT))
        s.listen(10)
        while True:
            conn, addr = s.accept()
            with conn:
                while True:
                    # データを受け取る
                    data = conn.recv(1024)
                    if not data:
                        break
                    print('data : {}, addr: {}'.format(data, addr))
                    conn.sendall(b'Received: ' + data)

if __name__ == '__main__':
    socketConnectServer()
    print("プログラムを終了しました。")

実行結果
server.png
client.png

参考:WikiPedia:TCPやUDPにおけるポート番号の一覧
ウェルノウンポート番号 (0–1023)
登録済みポート番号 (1024–49151)
動的・プライベート ポート番号 (49152–65535)

ぷれじ

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0