1はじめに
Pythonは、次の2つのレベルのサービスを提供します。
- ソケット(低レベル)
- SocketServer(高レベル)
ソケットとは何ですか?TCPプロトコルの抽象化である「ソケット」として一般に知られているこのソケットは、ホスト間またはプロセス間の通信に使用できます。
まず、簡単な例を使用して、ソケットの作成、接続、および通信の基本的な手順を理解します。サーバー側の基本的な手順:
- ホスト名、ポートをバインドします
- acceptメソッドを使用して待機します
- クライアントにメッセージを送信します
# 引入模块
import socket
import sys
# 创建socket对象,套接字家族选用AF_INET,套接字类型选用面向连接。
server_socket = socket.socket(
family=socket.AF_INET,
type=socket.SOCK_STREAM
)
# 获取本机主机名:MacBook-Pro.local
host = socket.gethostname()
port = 9999
# 绑定端口号
server_socket.bind((host, port))
# 设置最大连接数,超过后排队
server_socket.listen(5)
while True:
# 建立客户端连接
client_socket, addr = server_socket.accept()
print(f'连接地址:{addr}')
message = 'Hello world, socket!'
client_socket.send(
message.encode('UTF-8')
)
client_socket.close()
クライアント側の基本的な手順:
- サービスに接続するためのホスト名とポートを指定します
- メッセージを受け入れる
import socket
import sys
# 创建socket对象
s = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
# 获取本机名,设置端口号
hostname = socket.gethostname()
port = 9999
# 连接到服务
s.connect(
(hostname, port)
)
# 接受消息
message = s.recv(1024)
print(message.decode('UTF-8'))
2ポート
ソケットは、ユーザープログラムとカーネルが情報と対話するための単なるハブであり、多くの情報を持っておらず、ネットワークプロトコルとポート番号も持っていません。ネットワーク通信中は、ソケットをアドレスに関連付ける必要があります。このプロセスは、アドレスバインディングのプロセスです。
多くの場合、カーネルはアドレスを自動的にバインドしますが、多くの場合、メモリと管理の便宜のために手動でバインドされます。最も一般的な状況は、サーバープロセスがポートをバインドし、他のプロセスが接続するのを待つことです。
以下は、サーバー側のコードである簡単な検証です。
# 引入模块
import socket
import sys
# 创建socket对象,套接字家族选用AF_INET,套接字类型选用面向连接。
server_socket = socket.socket(
family=socket.AF_INET,
type=socket.SOCK_STREAM
)
# 获取本机主机名:MacBook-Pro.local
host = socket.gethostname()
port = 9999
# 绑定端口号
server_socket.bind((host, port))
# 设置最大连接数,超过后排队
server_socket.listen(5)
count = 0
while True:
# 建立客户端连接
client_socket, addr = server_socket.accept()
count += 1
print(f'连接地址:{addr}')
print(count)
message = 'Hello world, socket!'
client_socket.send(
message.encode('UTF-8')
)
client_socket.close()
各接続後、相手のIPとポートが出力されるため、ポートの変化をより明確に観察できます。
クライアント側(バインドされていない固定ポート)
import socket
import sys
# 创建socket对象
s = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
# 获取本机名,设置端口号
hostname = socket.gethostname()
port = 9999
# 连接到服务
s.connect(
(hostname, port)
)
# 接受消息
message = s.recv(1024)
print(message.decode('UTF-8'))
最初にサーバー側を起動し、次にクライアント側を起動すると、クライアント側が次の文字をエコーするのがわかります。Helloworld、socket!
数回実行した後、client.pyのポートが変更されていることは明らかであり、そのポートがシステムによって自動的に割り当てられていることを示しています。
ポートを手動でバインドしてIPポートを目的のポートに固定し、接続する前に次のコードを実行することを検討できます。
s.bind(
(hostname, 59446)
)
最終的なコードは次のとおりです。
import socket
import sys
# 创建socket对象
s = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
# 获取本机名,设置端口号
hostname = socket.gethostname()
port = 9999
# 连接到服务
s.bind(
(hostname, 59446)
)
s.connect(
(hostname, port)
)
# 接受消息
message = s.recv(1024)
print(message.decode('UTF-8'))
ポートを手動でバインドした後、ポートが修正されていることがわかります
結果は上記のとおりです。ポートがバインドされていない場合、システムは自動的にポートを割り当てます。
付録
リファレンスチュートリアル:
- Python3ネットワークプログラミング:https://www.runoob.com/python3/python3-socket.html
- ネットワークプログラミングソケットのバインド機能:https://blog.csdn.net/dongliqiang2006/article/details/5824651