トピックに直接移動します
udp接続
この接続では、サーバーとクライアントの間に明確な違いはありません。実際、ユーザーはサーバーまたはクライアントのいずれかです。ソケットは、pythonでネットワークプログラミングを完了するために使用されます。
具体的なコードは次のとおりです。
クライアント
#socket.AF_INET 是建立连接 socket.SOCK_DGRAM 是使用UDP链接
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
id = socket.gethostbyname(socket.gethostname()).split(":")[0]
s.sendto('hello'.encode('utf'),(id,8088))
s.close()
print("发送成功!!!!")
サーバ
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
id = socket.gethostbyname(socket.gethostname()).split(":")[0]
s.bind((id,8088))
print('准备接收中')
data=s.recvfrom(1024)
print("%s"%(data[0].decode('utf')))
説明は次のとおり
です
。gethostbyname()メソッドは(ローカルエリアネットワーク内の)現在のホストのIPアドレスを取得できます。Recvfrom()は受信情報です。これはクライアントから受信するメソッド
であり、これはブロッキングメソッドです。このメソッドは2つの値を返します。1つはバイナリです。データ、もう1つは送信者のIPであり、ポート
bind()はIPとポートをバインドするためのものであり、データを受信するときに使用する必要があります。
TCP接続
TCPとUDPとの間の差は、最初のサーバに接続すること、TCPが必要である。このことの利点は、データ伝送のセキュリティを確保することができることである。UDPのみの問題を起こしやすい接続を保証せずに送信される。
以下のとおりであります例:
クライアント:
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
id = socket.gethostbyname(socket.gethostname()).split(":")[0]
s.connect((id,8089))
s.send('hello'.encode('utf8'))
print("数据发送完成")
tes=s.recv(1024)
print(tes.decode('utf8'))
s.close()
サーバ
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
id = socket.gethostbyname(socket.gethostname()).split(":")[0]
s.bind((id,8089))
print("TCP服务器开启")
s.listen(128)
data,ip_where=s.accept()
print(data.recv(1024).decode('utf8'))
data.send('world'.encode('utf8'))
説明:
サーバー側では、accept()を使用してデータを受信し
、2つの値を返します。1つは送信者のソケットです。つまり、これを直接使用して送信者のデータを受け入れ、送信者にデータを送信できます。もう1つはこれは送信者のIPとポート
lsten()です。これはサーバーが圧力を超えることができる接続の最大数です。ここで128を設定すると、最大で128の接続を過負荷にできます。
実際の戦闘、ファイルダウンロードサーバーの練習
ダウンロードのセキュリティを考慮して、
クライアントに接続するためにtcpを使用する事故はありません
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
id = socket.gethostbyname(socket.gethostname()).split(":")[0]
s.connect((id,8089))
filename = str(input("输入您要下载的音乐:"))
s.send(filename.encode('utf-8'))
data = s.recv(1024)
try:
data.decode("utf-8")
print("文件不存在")
except :
#由于是在同一台电脑上为了做出区别下载的文件名字前面会加"下载的"
with open("下载的"+filename,'wb') as file:
file.write(data)
while True:
data=s.recv(1024)
if data:
file.write(data)
else:
print("下载完成")
break
サーバ:
import socket
import os
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
id = socket.gethostbyname(socket.gethostname()).split(":")[0]
s.bind((id,8089))
s.listen(128)
print("服务器启动")
client = s.accept()[0]
filename = client.recv(1024).decode("utf-8")
if os.path.isfile(filename):
with open(filename,'rb') as file:
content = file.read()
client.send(content)
print("文件发送完成")
else:
client.send("文件不存在".encode('utf-8'))
非常に高速で、ほぼ瞬時