pythonネットワーク接続(udpおよびtcp)

トピックに直接移動します

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'))

ここに写真の説明を挿入
非常に高速で、ほぼ瞬時

おすすめ

転載: blog.csdn.net/FUTEROX/article/details/112375277