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番とか)が、これを動的・
プライベートポート番号に変更するだけでプログラムが正常に稼働し、通信できた。
通信エラーがでる人はプログラムで利用するポート番号を確認してほしい。
# 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()
# 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("プログラムを終了しました。")
参考:WikiPedia:TCPやUDPにおけるポート番号の一覧
ウェルノウンポート番号 (0–1023)
登録済みポート番号 (1024–49151)
動的・プライベート ポート番号 (49152–65535)
ぷれじ