OSError: [WinError 10038] Es wurde eine Operation für etwas versucht, das kein Socket ist
-
Erstellen Sie eine Anwendung mit Hilfe des
socket
-Moduls ohne Fehler in Python -
der
OSError: [WinError 10038] An Operation Was Attempted on Something That Is Not a Socket
Mit dieser Erklärung lernen wir, was Server und Client sind und wie man das Modul socket
verwendet, um eine Anwendung mit Hilfe von Server und Client zu erstellen. Wir werden auch lernen, wie man Fehler vermeidet, wenn man diese Art von Anwendungen in Python erstellt.
Erstellen Sie eine Anwendung mit Hilfe des socket
-Moduls ohne Fehler in Python
Im Internet kann der Knoten ein Server oder ein Client sein; Natürlich kann es auch ein Client-zu-Client-Netzwerk sein, in dem Sie alle Knoten haben und miteinander sprechen. Es ist ein Peer-to-Peer-Netzwerk.
Wir haben Server im Internet, die den Clients zuhören, und sie warten darauf, dass der Client eine Anfrage sendet.
Wenn Sie beispielsweise zu google.com
, dem Google-Server, gehen und eine Anfrage an den Google-Server senden, sendet Ihnen der Google-Server eine Antwort, d. h. eine Seite oder eine Seite nicht gefunden
-Nachricht.
Beginnen wir mit der Erstellung von zwei Python-Dateien, demo.py
und client.py
. Wir wollen die Nachricht vom Server an den Client senden.
Server und Client können sich an unterschiedlichen Standorten oder außerhalb des Netzwerks befinden.
Wir werden den Server erstellen und dann eine Nachricht weitergeben und sehen, wie dieser Client die Nachricht vom Server empfängt. Um es einfach zu halten, machen wir es auf dem Localhost, aber Sie können es auch auf anderen Systemen machen.
Als erstes müssen wir den socket
importieren und eine Instanz erstellen. Wir rufen die Socket-Klasse auf und spezifizieren dann die Socket-Familie.
Die Socket-Familie ist AF_INET
und die Socket-Formel ist SOCK_STREAM
.
Im nächsten Schritt müssen wir den Socket mit der Methode bind()
an den Hostnamen am Port binden. Jetzt müssen wir mit der Methode listen()
auf Verbindungen lauschen; die maximale Anzahl von Verbindungen wäre 5.
import socket
SKT = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
SKT.bind((socket.gethostname(), 6060))
SKT.listen(5)
Um eine Verbindung mit einem Client zu finden, senden wir eine Nachricht vom Server, damit der Client die Nachricht erhält.
Dazu verwenden wir die while
-Schleife, die True
wäre. In dieser Schleife erstellen wir mit der Methode connect()
einen weiteren Socket, der der Client-Socket wäre; es wird in der Datei client.py
verwendet.
Wir verwenden die accept()
-Methode, die zwei Werte zurückgibt; Deshalb haben wir zwei Variablen deklariert, die den eingehenden Socket und die Adresse der eingehenden Verbindung speichern. Jetzt drucken wir eine Nachricht, die zeigt, dass eine Verbindung von der angegebenen Adresse hergestellt wurde.
while True:
Client_Socket, Adress = SKT.accept()
print(f"Connection has been established from {Adress}")
Jetzt müssen wir eine Nachricht in Bytes senden. Die Kodierung ist utf-8
und wird an jeden Client gesendet, der mit dem Socket verbunden ist.
Client_Socket.send(bytes("Welcome to the server!!!", "utf-8"))
Client_Socket.close()
Unser Socket ist bereit, auf die Verbindung zu hören. Jetzt arbeiten wir in der Datei client.py
und verwenden denselben Code mit Ausnahme der Methode connect()
.
In der connect()
-Methode verwenden wir den gleichen Hostnamen, Localhost und Port.
Jetzt erhalten wir die Nachricht, die vom Server kommt. Wir verwenden die Methode recv()
und übergeben sie an 2048 Bytes.
Wir drucken diese Nachricht aus, um zu überprüfen, ob die Nachricht eingegangen ist oder nicht.
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}")
Jetzt ist die Anwendung abgeschlossen, also führen wir zuerst den Server aus, die Datei demo.py
; es läuft, aber es ist nichts passiert. Wenn wir zu client.py
gehen und diese Datei in einem interaktiven Fenster ausführen, können wir die Antwort in der Konsole sehen, wenn diese Dateien gleichzeitig ausgeführt werden.
der OSError: [WinError 10038] An Operation Was Attempted on Something That Is Not a Socket
Es gibt einige häufige Gründe, warum beim Erstellen dieser Anwendung Fehler auftreten. Ein Grund könnte sein, dass Sie vergessen haben, eine Datei oder beide auszuführen, oder dass Sie irgendwo einen Fehler machen.
Schauen wir uns ein Beispiel an, bei dem die Benutzer diesen Fehler häufig erhalten.
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()
Ausgang:
OSError: [WinError 10038] An operation was attempted on something that is not a socket
Dies liegt daran, dass wir eine verschachtelte while
-Schleife ausführen und beide True
sind. Wenn die äußere while
-Schleife ausgeführt wird, akzeptieren wir die eingehende Verbindung vom Client.
Das Problem tritt auf, wenn die innere while
-Schleife ausgeführt wird.
Da die innere while
-Schleife beim ersten Mal True
ist, wird diese Schleife perfekt ausgeführt, aber in der zweiten Iteration muss die while
-Schleife eine eingehende Verbindung akzeptieren. Die Methode accept()
ruft von der äußeren Schleife auf, die niemals aufgerufen wird; Aus diesem Grund wird festgestellt, dass der Socket nicht mehr vorhanden ist.
Ein weiterer Grund, warum das Problem auftreten kann, ist, wenn Sie diese beiden Dateien vom Terminal aus ausführen. Wenn Sie in VS-Code arbeiten, führen Sie diese beiden Dateien einzeln in (aktuelle Datei in einem interaktiven Fenster) aus.
Vollständiger demo.py
-Dateicode:
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.
LinkedInVerwandter Artikel - Python Error
- Adresse wird bereits verwendet Fehler in Python
- AttributeError: __Exit__ in Python
- AttributeError: 'Dict'-Objekt hat kein Attribut 'Append' in Python
- AttributeError: 'NoneType'-Objekt hat kein Attribut 'Text' in Python
- AttributeError: Int-Objekt hat kein Attribut
- AttributeError: Modul Urllib hat keine Attributanforderung