Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführliche Erklärung und praktische Anleitung zur Python-Socket-Programmierung

Ausführliche Erklärung und praktische Anleitung zur Python-Socket-Programmierung

王林
王林nach vorne
2023-04-22 17:04:082842Durchsuche

Im heutigen Internet ist das Socket-Protokoll eine der wichtigsten Grundlagen. Dieser Artikel behandelt alle Bereiche der Arbeit mit der Socket-Programmierung in Python.

Ausführliche Erklärung und praktische Anleitung zur Python-Socket-Programmierung

Warum Sockets verwenden

Sockets sind verschiedene Kommunikationsprotokolle, aus denen heutige Netzwerke bestehen. Es ist möglich, Informationen zwischen Programmen zu übertragen oder Geräte. Wenn wir beispielsweise einen Browser öffnen, stellen wir als Client eine Verbindung zum Server her, um Informationen zu übertragen.

Bevor wir uns mit diesem Kommunikationsprinzip befassen, wollen wir zunächst klären, was Sockets sind.

Was sind Sockets

Im Allgemeinen sind Sockets interne Anwendungsprotokolle, die zum Senden und Empfangen von Daten erstellt wurden. Ein einzelnes Netzwerk verfügt über zwei Sockets, einen für jedes kommunizierende Gerät oder Programm. Diese Sockets sind eine Kombination aus IP-Adresse und Port. Abhängig von der verwendeten Portnummer kann ein einzelnes Gerät über „n“ Sockets verfügen und verschiedene Ports können für verschiedene Protokolltypen verwendet werden.

Die folgende Abbildung zeigt einige gängige Portnummern und zugehörige Protokollinformationen:

# 🎜🎜#Python-BibliothekAnwendungHTTP#🎜🎜 # # ?? 🎜 # NNTP#🎜 🎜# 25smtplibE-Mail senden# 🎜🎜#TelnetMail empfangengopherlib
Protokoll


Portnummer

#🎜 🎜 #



# 🎜 🎜 #


80

# 🎜. 🎜 #

httplib,urllib,requests

Webseite, Website

# 🎜🎜#


FTP

119

nttplib

News Transfer


SMTP


#🎜 🎜 #





#🎜🎜 #23# ?? 🎜#


POP3


110

#🎜. 🎜#

poplib


#🎜 🎜 #

Gopher


70


#🎜 🎜 #

Dokumentenübertragung

Da wir nun das Konzept von Sockets verstanden haben, schauen wir uns das Socket-Modul von Python an Um die Socket-Programmierung zu implementieren, müssen Sie das Socket-Modul importieren.

Einige wichtige Methoden dieses Moduls sind wie folgt:

#🎜 🎜#Methode wird zum Erstellen eines Sockets verwendet (sowohl Server als auch Client müssen erstellt werden) #🎜 🎜## Wird zum Akzeptieren der Verbindung verwendet. Es wird ein Wertepaar (Verbindung, Adresse) zurückgegeben, wobei Verbindung das neue Socket-Objekt ist, das zum Senden oder Empfangen von Daten verwendet wird, und Adresse die Socket-Adresse am anderen Ende der Verbindung ist socket.bind()Wird zum Binden an die Adresse verwendet als Parameter angegeben Verwendung Zum Schließen des Sockets Wird zur Verbindung mit der als Parameter angegebenen Remote-Adresse verwendet.

Beschreibung

#🎜 🎜# #🎜 🎜#

socket.socket()

# 🎜🎜#
# 🎜🎜#



socket.connect()


#🎜 🎜#


#🎜🎜 #

socket.listen()# Lassen Sie den Server Verbindungen akzeptieren

Da wir nun die Bedeutung des Socket-Moduls verstanden haben, sehen wir uns an, wie man Server und Clients in Python erstellt.

Was ist ein Server?

Ein Server ist entweder ein Programm, ein Computer oder ein Gerät, das speziell zur Verwaltung von Netzwerkressourcen verwendet wird. Der Server kann sich auf demselben Gerät oder Computer befinden, lokal mit anderen Geräten und Computern verbunden oder sogar remote sein. Es gibt verschiedene Arten von Servern wie Datenbankserver, Webserver, Druckserver usw.

Server verwenden normalerweise socket.socket(), socket.bind(), socket.listen() usw., um Verbindungen herzustellen und an Clients zu binden. Lassen Sie uns nun ein Programm schreiben, um einen Server zu erstellen.

import socket
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(),1234))
#port number can be anything between 0-65535(we usually specify non-previleged ports which are > 1023)
s.listen(5)
 
while True:
clt,adr=s.accept()
print(f"Connection to {adr}established")
 #f string is literal string prefixed with f which 
 #contains python expressions inside braces
clt.send(bytes("Socket Programming in Python","utf-8 ")) #to send info to clientsocket

Die erste notwendige Voraussetzung zum Erstellen eines Sockets ist der Import der relevanten Module. Verwenden Sie dann die Methode socket.socket(), um einen serverseitigen Socket zu erstellen.


AF_INET bezieht sich auf die Adresse aus dem Internet, die ein Paar (Host, Port) erfordert, wobei der Host ein spezifischer sein kann Website Die URL oder ihre Adresse, die Portnummer ist eine Ganzzahl. SOCK_STREAM wird zum Erstellen des TCP-Protokolls verwendet.

bind()​ Methode akzeptiert zwei Parameter als Tupel (Host, Port). Hierbei ist zu beachten, dass am besten eine 4-stellige Portnummer verwendet wird, da niedrigere Portnummern in der Regel vom System belegt bzw. reserviert sind. Mit der Methode listen() kann der Server Verbindungen akzeptieren, und 5 ist eine Warteschlange für mehrere gleichzeitig akzeptierte Verbindungen. Der Mindestwert, der hier angegeben werden kann, ist 0. Wenn keine Parameter angegeben werden, werden die standardmäßigen entsprechenden Parameter verwendet.

while​-Schleife ermöglicht das dauerhafte Akzeptieren von Verbindungen, clt und adr​ sind die Clientobjekte und -adressen, die print​-Anweisung gibt lediglich die Adresse und Portnummer des Client-Sockets aus und schließlich clt. send wird zum Senden von Daten in Bytes verwendet.

Da nun unser Server eingerichtet ist, gehen wir zum Client über.

Was ist ein Client?

Ein Client ist ein Computer oder eine Software, die Informationen oder Dienste von einem Server empfängt. Beim Client-Server-Modell fordert der Client Dienste vom Server an. Die besten Beispiele sind Webbrowser wie Google Chrome, Firefox usw. Diese Webbrowser fordern den Webserver auf, die erforderlichen Webseiten und Dienste basierend auf den Anweisungen des Benutzers bereitzustellen. Weitere Beispiele sind Online-Gaming, Online-Chat usw.

Jetzt sehen wir uns an, wie man ein Client-Programm in der Programmiersprache Python schreibt:

import socket
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), 2346))
msg=s.recv(1024)
print(msg.decode("utf-8"))

Importieren Sie zunächst noch das Socket-Modul und erstellen Sie dann den Socket wie beim Erstellen eines Servers. Um dann eine Verbindung zwischen Client und Server herzustellen, müssen Sie die Methode connect() verwenden, indem Sie (Host, Port) angeben.

Hinweis: gethostname muss verwendet werden, wenn sich Client und Server auf demselben Computer befinden. (LAN–localip/WAN–publicip)

Hier möchte der Client einige Informationen vom Server erhalten, dazu müssen wir die Methode recv() verwenden, die Informationen sind in einer anderen in der Variablen msg gespeichert. Es ist wichtig zu beachten, dass die übertragenen Informationen in Bytes vorliegen und im Client des oben genannten Programms maximal 1024 Bytes (Puffergröße) in einer Übertragung empfangen werden können. Abhängig von der Menge der übertragenen Informationen kann eine beliebige Zahl angegeben werden.

Dekodieren und drucken Sie abschließend die übermittelte Nachricht aus.

Da wir nun wissen, wie man Client-Server-Programme erstellt, sehen wir uns an, wie sie ausgeführt werden müssen.

Client-Server-Interaktion

Um diese Programme auszuführen, müssen Sie das Befehlsprogramm öffnen, den Ordner eingeben, in dem die Client- und Serverprogramme erstellt werden, und dann Folgendes eingeben: # 🎜🎜#

py server.py #这里,server.py 是服务器的文件名
# 🎜🎜#Wie erwartet startet der Server

Ausführliche Erklärung und praktische Anleitung zur Python-Socket-ProgrammierungUm den Client auszuführen, müssen Sie ein weiteres cmd-Fenster öffnen und Folgendes eingeben:

pyclient.py
# 🎜🎜#

Reduzieren wir die Puffergröße auf 7 und sehen wir, wie das gleiche Programm aussehen wirdAusführliche Erklärung und praktische Anleitung zur Python-Socket-Programmierung

# 🎜🎜 #

Wie in der Abbildung gezeigt, wird die Verbindung nach der Übertragung von 7 Bytes beendet.

Ausführliche Erklärung und praktische Anleitung zur Python-Socket-ProgrammierungTatsächlich ist dies ein Problem, da wir nicht die vollständigen Informationen erhalten haben, die Verbindung jedoch vorzeitig geschlossen wurde.

Mehrfache Kommunikation

Um die Verbindung fortzusetzen, bevor der Client die vollständige Nachricht erhält, können wir eine While-Schleife verwenden

import socket
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), 2346))
while True:
msg=s.recv(7)
print(msg.decode("utf-8"))

Nach dieser Änderung Bei jeder Übertragung wird die vollständige Nachricht in 7 Bytes empfangen.

Aber das wirft ein weiteres Problem auf: Die Verbindung wird nie beendet, man weiß nie, wann sie beendet wird. Was passiert auch, wenn wir nicht wirklich wissen, wie groß die Nachricht oder Informationen ist, die der Client vom Server erhält? In diesem Fall müssen wir den Code weiter verbessern.

程序会检查信息的大小,并将其打印到一次两个字节的缓冲区中,然后在完成连接后关闭连接。

传输 Python 对象

目前为止我们仅仅掌握了传递字符串的方法,但是,Python 中的 Socket 编程也允许我们传输 Python 对象。这些对象可以是集合、元组、字典等。要实现这一点,需要用到 Python 的 pickle 模块。

Python pickle模块

当我们实际序列化或反序列化 Python 中的对象时,就会使用到 Python pickle 模块。让我们看一个小例子

import pickle
 
mylist=[1,2,'abc']
mymsg = pickle.dumps(mylist) 
print(mymsg)

Output:

b’x80x03]qx00(Kx01Kx02Xx03x00x00x00abcqx01e.’

在上面的程序中,mylist​是使用pickle模块的dumps()​函数序列化的。还要注意,输出以b开头,表示它已转换为字节。在 socket 编程中,可以实现此模块以在客户端和服务器之间传输 python 对象。

如何使用 pickle 模块传输 Python 对象

当我们将 pickle 与 socket 一起使用时,完全可以通过网络传输任何内容。

先来看看服务端代码

Server-Side:

import socket
import pickle
 
a=10
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(), 2133))#binding tuple
s.listen(5)
while True:
clt , adr = s.accept()
print(f"Connection to {adr}established")
 
m={1:"Client", 2:"Server"}
mymsg = pickle.dumps(m)#the msg we want to print later
mymsg = {len(mymsg):{a}}"utf-8") + mymsg
clt.send(mymsg)

这里,m​是一个字典,它基本上是一个需要从服务器发送到客户端的 Python 对象。这是通过首先使用dumps()序列化对象,然后将其转换为字节来完成的。

现在,让我们记下客户端:

Client-Side:

import socket
import pickle
a=10
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), 2133))
 
while True:
complete_info = b''
rec_msg = True
while True:
mymsg = s.recv(10)
 if rec_msg:
print(f"The length of message = {mymsg[:a]}")
x = int (mymsg[:a ] )
rec_msg = False
complete_info += mymsg
if len(complete_info)-a == x:
print("Recieved the complete info")
print(complete_info[a:])
m = pickle.loads(complete_info[a:])
print(m)
rec_msg = True
complete_info = b''
print(complete_info)

第一个while循环将帮助我们跟踪完整的消息(complete_info)以及正在使用缓冲区接收的消息(rec_msg)。

然后,在接收消息时,我们所做的就是打印每一位消息,并将其放在大小为10的缓冲区中接收。此大小可以是任何大小,具体取决于个人选择。

然后如果收到的消息等于完整消息,我们只会将消息打印为收到的完整信息,然后使用loads()反序列化消息。

输出如下:

Ausführliche Erklärung und praktische Anleitung zur Python-Socket-Programmierung

Das obige ist der detaillierte Inhalt vonAusführliche Erklärung und praktische Anleitung zur Python-Socket-Programmierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:51cto.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen