OSError: [WinError 10038] ソケットではないものに対して操作が試行されました
この説明では、サーバーとクライアントとは何か、そして socket
モジュールを使用してサーバーとクライアントの助けを借りてアプリケーションを作成する方法を学びます. また、Python でこれらのタイプのアプリケーションを作成する際のエラーを回避する方法も学びます。
socket
モジュールを使用して Python でエラーのないアプリケーションを作成する
インターネット上では、ノードはサーバーまたはクライアントになることができます。 もちろん、すべてのノードがあり、互いに通信しているクライアント間のネットワークにすることもできます。 これはピアツーピア ネットワークです。
インターネット上にクライアントをリッスンするサーバーがあり、クライアントがリクエストを送信するのを待っています。
たとえば、Google サーバーである google.com
にアクセスし、Google サーバーにリクエストを送信すると、Google サーバーは何らかの応答、つまりページまたは Page Not Found
メッセージを送信します。
demo.py
と client.py
という 2つの Python ファイルを作成することから始めましょう。 サーバーからクライアントにメッセージを送信します。
サーバーとクライアントは、別の場所またはネットワークの外部にある可能性があります。
サーバーを作成し、メッセージを渡し、このクライアントがサーバーからメッセージを受信する方法を確認します。 簡単にするために、ローカルホストで実行していますが、別のシステムでも実行できます。
最初に行う必要があるのは、socket
をインポートしてインスタンスを作成することです。 ソケット クラスを呼び出してから、ソケット ファミリを指定します。
ソケット ファミリは AF_INET
になり、ソケット式は SOCK_STREAM
になります。
次のステップでは、bind()
メソッドを使用してソケットをポートのホスト名にバインドする必要があります。 ここで、listen()
メソッドを使用して接続をリッスンする必要があります。 接続の最大数は 5 です。
import socket
SKT = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
SKT.bind((socket.gethostname(), 6060))
SKT.listen(5)
クライアントとの接続を見つけるために、サーバーからメッセージを送信して、クライアントがメッセージを受信できるようにします。
そのために、True
になる while
ループを使用します。 このループでは、connect()
メソッドを使用して、クライアント ソケットとなる別のソケットを作成します。 client.py
ファイルで使用されます。
2つの値を返す accept()
メソッドを使用しています。 そのため、着信ソケットと着信接続のアドレスを格納する 2つの変数を宣言しました。 ここで、指定したアドレスから接続が確立されたことを示すメッセージを出力します。
while True:
Client_Socket, Adress = SKT.accept()
print(f"Connection has been established from {Adress}")
次に、メッセージをバイト単位で送信する必要があります。 エンコーディングは utf-8
で、ソケットに接続された各クライアントに送信されます。
Client_Socket.send(bytes("Welcome to the server!!!", "utf-8"))
Client_Socket.close()
ソケットは接続をリッスンする準備ができています。 client.py
ファイルで作業し、connect()
メソッド以外は同じコードを使用します。
connect()
メソッドでは、同じホスト名、ローカルホスト、およびポートを使用します。
次に、サーバーからのメッセージを受信します。 recv()
メソッドを使用して、2048 バイトに渡します。
メッセージが受信されたかどうかを確認するために、このメッセージを印刷します。
import socket
SKT = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
SKT.connect((socket.gethostname(), 6060))
MSG = SKT.recv(2048)
print(f"Message has been received {MSG}")
これでアプリケーションが完成したので、最初にサーバー、demo.py
ファイルを実行します。 実行されていますが、何も起こっていません。 client.py
に移動し、このファイルを対話型ウィンドウで実行すると、これらのファイルが同時に実行されたときにコンソールで応答を確認できます。
OSError: [WinError 10038] ソケットではないものに対して操作が試行されました
このアプリケーションの作成時にエラーが発生する一般的な理由がいくつかあります。 理由の 1つは、1つのファイルまたは両方のファイルを実行するのを忘れたか、どこかで間違いを犯している可能性があります。
ユーザーがこのエラーを頻繁に受け取る例を見てみましょう。
import socket
SKT = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
SKT.bind((socket.gethostname(), 6060))
SKT.listen(5)
while True:
Client_Socket, Adress = SKT.accept()
while True:
print(f"Connection has been established from {Adress}")
Client_Socket.send(bytes("Welcome to the server!!!", "utf-8"))
Client_Socket.close()
出力:
OSError: [WinError 10038] An operation was attempted on something that is not a socket
これは、ネストされた while
ループを実行しており、両方とも True
であるためです。 外側の while
ループが実行されると、クライアントからの着信接続を受け入れます。
この問題は、内側の while
ループが実行されるときに発生します。
内側の while
ループは最初は True
であるため、このループは完全に実行されますが、2 回目の反復では、while
ループは着信接続を受け入れる必要があります。 accept()
メソッドは、呼び出されることのない外側のループから呼び出します。 そのため、ソケットが存在しないことがわかります。
この問題が発生するもう 1つの理由は、ターミナルからこれら 2つのファイルを実行した場合です。 VS コードで作業している場合は、これら 2つのファイルを (対話型ウィンドウの現在のファイル) で個別に実行します。
完全な demo.py
ファイル コード:
import socket
SKT = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
SKT.bind((socket.gethostname(), 6060))
SKT.listen(5)
while True:
Client_Socket, Adress = SKT.accept()
print(f"Connection has been established from {Adress}")
Client_Socket.send(bytes("Welcome to the server!!!", "utf-8"))
Client_Socket.close()
Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.
LinkedIn関連記事 - Python Error
- AttributeError の解決: 'list' オブジェクト属性 'append' は読み取り専用です
- AttributeError の解決: Python で 'Nonetype' オブジェクトに属性 'Group' がありません
- AttributeError: 'generator' オブジェクトに Python の 'next' 属性がありません
- AttributeError: 'numpy.ndarray' オブジェクトに Python の 'Append' 属性がありません
- AttributeError: Int オブジェクトに属性がありません
- AttributeError: Python で 'Dict' オブジェクトに属性 'Append' がありません