Heim > Artikel > Backend-Entwicklung > Python-Netzwerkprogrammierung
Socket verstehen
Socket wird üblicherweise zur Beschreibung der IP-Adresse und des Ports verwendet. Es handelt sich um das Handle einer Kommunikationskette, die normalerweise über „Socket“ an das Netzwerk gesendet wird „Oder auf Netzwerkanfragen antworten.
Socket stammt von Unix und eine der Grundphilosophien von Unix/Linux lautet „Alles ist eine Datei“. Verwenden Sie für den Betrieb den Modus [Öffnen] [Lesen und Schreiben] [Schließen]. Socket ist eine Implementierung dieses Modus. Socket ist eine spezielle Datei, und einige Socket-Funktionen sind Operationen darauf (E/A lesen/schreiben, öffnen, schließen).
Der Unterschied zwischen Socket und Datei:
Das Dateimodul wird zum [Öffnen] [Lesen und Schreiben] [Schließen] für eine bestimmte Datei verwendet.
Das Socket-Modul wird zum [Öffnen] [Lesen und Schreiben] [Schließen] für die Serverseite verwendet und clientseitige Sockets.
#!/usr/bin/env python # coding=utf-8 # Author:Majh import socket ip_port = ('127.0.0.1', 9999) sk = socket.socket() sk.connect(ip_port) send_data = input('>>').strip() sk.send(bytes(send_data, encoding='utf-8')) recv_data = sk.recv(1024) print(str(recv_data, encoding='utf-8')) sk.close() 客户端代码
#!/usr/bin/env python # coding=utf-8 # Author:Majh import socket sk = socket.socket() ip_port = ('127.0.0.1', 9999) sk.bind(ip_port) print('sk.bind......') sk.listen(5) print('sk.listen......') conn, addr = sk.accept() print('conn:', conn) print('addr:', addr) read_data = conn.recv(1024) print('read_data', read_data) read_data = read_data.upper() conn.send(read_data) conn.close() 服务器端代码Socket-Schlüsselwort-Parameter: sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)Parameter 1: Adresscluster socket.AF_INET IPv4 ( Standard)
socket.AF_INET6 IPv6
socket.SOCK_DGRAM Datagram-Socket für UDP
Socket.SOCK_RDM ist eine zuverlässige Form von UDP, die die Zustellung von Datagrammen garantiert, jedoch nicht die Reihenfolge. SOCK_RAM wird verwendet, um Low-Level-Zugriff auf das Originalprotokoll bereitzustellen und wird verwendet, wenn bestimmte spezielle Vorgänge ausgeführt werden müssen, beispielsweise das Senden von ICMP-Nachrichten. SOCK_RAM ist normalerweise auf Programme beschränkt, die von Hauptbenutzern oder Administratoren ausgeführt werden.
socket.SOCK_SEQPACKET Zuverlässiger kontinuierlicher Paketdienst
Dieser Wert kann nicht unendlich sein, da die Verbindungswarteschlange vorhanden ist muss im Kernel gepflegt werden
sk.sendall(string[,flag])
Sendet die Daten als Zeichenfolge an den verbundenen Socket, versucht jedoch, alle Daten zu senden, bevor sie zurückgegeben wird. Gibt bei Erfolg „Keine“ zurück und löst bei einem Fehler eine Ausnahme aus.
Intern werden Aufrufe rekursiv gesendet, um den gesamten Inhalt zu senden.
sk.sendto(string[,flag],address)
Daten an den Socket senden, Adresse ist ein Tupel in der Form (ipaddr, port), das die Remote-Adresse angibt. Der Rückgabewert ist die Anzahl der gesendeten Bytes. Diese Funktion wird hauptsächlich für das UDP-Protokoll verwendet.
sk.settimeout(timeout)
Legen Sie den Timeout-Zeitraum für Socket-Vorgänge fest. Der Timeout ist eine Gleitkommazahl in Sekunden. Der Wert „Keine“ bedeutet, dass es keine Zeitüberschreitung gibt. Im Allgemeinen sollte der Timeout-Zeitraum festgelegt werden, wenn der Socket gerade erst erstellt wird, da er für Verbindungsvorgänge verwendet werden kann (z. B. Warten auf Client-Verbindungen bis zu 5 Sekunden)
sk.getpeername()
Gibt den Verbindungssocket zurück. Die Remote-Adresse der Schnittstelle. Der Rückgabewert ist normalerweise ein Tupel (ipaddr, port).
sk.getsockname()
Gibt die eigene Adresse des Sockets zurück. Normalerweise ein Tupel (ipaddr,port)