Pythonの研究ノート--Day07

Pythonの研究ノート--Day07

七日目は、今日のネットワークプログラミング関連確認してください。二日前にあるため、自分の仕事、遅れたブログ更新の。

ソケットを使用してください

ソケット(以下、ソケット)が通信するために、他のプロセスとの関係が主な違いである、プロセス間通信の方法です:それはサービスの多くを完了するために、当社のネットワーク上の異なるホスト間のプロセス間通信を実現することができますソケットに基づいています通信。

Pythonのソケット缶機能で使用されるソケットモジュール

import socket
socket.socket(AddressFamily,Type)

まずsocket.socketは、ソケットを作成し、この関数は2つのパラメータを取ります。

  • アドレスファミリ:あなたは(同じマシン上のプロセス間通信のために)AF_INET(プロセス間通信のためのインターネット)またはAF_UNIXを選択することができ、一般的な作業に使用されるがAF_INETであります
  • TYPE:ソケットタイプがSOCK_STREAM(主にTCPプロトコルのストリームソケット)またはSOCK_DGRAM(主にUDPプロトコルのデータグラムソケット)であってもよいです

たとえば、私は、TCPソケットを作成した場合、その書き込み

import socket

# 创建tcp的套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 功能代码 略...
...

# 当逻辑结束后,关闭socket
s.close()

ソケットを作成するには、UDPソケットは、その後のみsocket.SOCK_DGREAMを交換し、二番目のパラメータにアプローチする必要があります

import socket

# 创建udp的套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 功能代码 略...
...

# 当逻辑结束后,关闭socket
s.close()

これは単に、ソケットを使用したプロセスであり、

  1. ソケットを作成します。
  2. データを送信/受信するためのソケットを使用して
  3. ソケットを閉じ

それは少し慣れていないですか?日の第四ファイル操作、私はちょうど日曜日は、操作に関連する文書の概要を詳細に明日、小さな例を書いた、近くにclose()メソッドを呼び出し、その後、このプロセスは少し似て、開いているファイル、ファイルを操作し、コンテンツ。

UDP送信/受信データを作成します。

単純な送受信手順ソケット

コードのループを受け取ります

#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:socket接收
import socket


def main():
    # 创建udp socket
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 绑定端口
    local_addr = ("127.0.0.1", 8080)
    s.bind(local_addr)

    # 循环接收
    while True:

        # 接收数据,返回的是一个元组(接收到的数据,(发送方的地址信息))
        recv_message = s.recvfrom(1024)
        recv_data = recv_message[0]
        recv_address = recv_message[1]
        # 打印结果
        print("从%s接收:%s" % (recv_address, recv_data.decode("utf-8")))
        # 如果接收的是quit
        if recv_data.decode("utf-8") == 'quit':
        	print("接收程序退出")
            break
    s.close()


if __name__ == "__main__":
    main()

コード伝送ループ

#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:udp socket 发送
import socket


def main():
    # 创建udp socket
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    while True:
        # 键盘录入要发送的数据
        send_data = input("请输入要发送的数据:")

        # 发送数据,
        send_addr = ("127.0.0.1", 8080)
        s.sendto(send_data.encode("utf-8"), send_addr)
        # 若输入quit 退出程序
        if send_data == "quit":
            print("发送程序退出")
            break
    s.close()


if __name__ == "__main__":
    main()

プログラムの結果

发送程序

请输入要发送的数据:你好
请输入要发送的数据:quit
发送程序退出
接收程序

从('127.0.0.1', 62189)接收:你好
从('127.0.0.1', 62189)接收:quit
接收程序退出

プロセスまたはセットプロセスの、ソケットを作成し、送信し、ソケットを使用してデータを受信し、ソケットを閉じたが、無限ループを加え、一度にプログラムを終了する終了入力され、文字列が符号化されることに注意することが必要ですバイトコードは、使用復号化されstr.encode(encoding="utf-8", errors="strict")``bytes.decode(encoding="utf-8", errors="strict")、例えばIがUTF-8を使用して、コード手段が処理を符号化および復号化に使用されるエンコード項、エラーがエラー処理方式を指します。特定の参照は公式文書かもしれません。そこUDPは受信と送信のプロセスは何か別のを持って、多段階の受信であるsocket.bind()。この場合、オペレーティングシステムは、ランダムパラメータはタプルがタプルIPとポートで渡され、実際には、ポートをバインドすることはできませんが、私たちは、このステップの仕事だポート割り当て、再実行プログラムがポートの変更を送ることができますが、サーバー側のプログラムとして、ポートは常に私たちが日々のポートを変更する必要があるクライアントは、その後、変更され、結合ポートの目的を。

ケース-udpチャットルーム

#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:udp 聊天室
import socket


def send_msg(s):
    send_ip = input("请输入要发送的IP地址:")
    send_port = int(input("请输入要发送的端口号:").strip())
    send_message = input("请输入要发送的信息:")
    s.sendto(send_message.encode("utf-8"), (send_ip, send_port))


def recv_msg(s):
    recv_message = s.recvfrom(1024)
    recv_data = recv_message[0].decode("utf-8")
    recv_addr = recv_message[1][0] + ": " + str(recv_message[1][1])
    print("从%s接收消息:%s" % (recv_addr, recv_data))


def main():
    # 创建udp socket
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.bind(("", 8080))
    while True:
        print("欢迎进入聊天室")
        print("1.发送消息")
        print("2.接收消息")
        print("0.退出聊天室")
        op = input("请输入操作:")
        if op == "1":
            # 发送
            send_msg(s)
        elif op == "2":
            # 接收
            recv_msg(s)
        elif op == "0":
            print("退出聊天室")
            break
        else:
            print("输入有误,请重新输入。")
    s.close()


if __name__ == "__main__":
    main()

その出力に送られました

欢迎进入聊天室
1.发送消息
2.接收消息
0.退出聊天室
请输入操作:1
请输入要发送的IP地址:127.0.0.1
请输入要发送的端口号:8080
请输入要发送的信息:haha
欢迎进入聊天室
1.发送消息
2.接收消息
0.退出聊天室
请输入操作:2
从127.0.0.1: 8080接收消息:haha
欢迎进入聊天室
1.发送消息
2.接收消息
0.退出聊天室
请输入操作:0
退出聊天室

だから、私たちの小さなチャットルームは完了です!しかし、この小さなチャットルームは、あなたが知っていれば、私の記事の後に返信をお願いし、非常に深刻な問題を抱えている、私は次のブログ記事を明らかにお答えします

TCPソケット

TCPソケットTCPプロトコルは、ネットワーク通信を実現するためのプログラミング・インターフェースによって提供されるトランスポート・サービスを使用することです。第2のソケットへの唯一の方法のSOCK.STREAMパラメータ設定TCPソケットを取得することができます。ホストに起因するので、サーバとして、あなたはそれを指定したIPアドレスとポートにバインドされた後、ソケットオブジェクトを作成する必要があり、複数のIPアドレスを持ち、異なるサービスの数を設定する可能性があることがあります。
サーバとクライアントで見てみましょう

#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:tcp 套接字服务器端
import socket


def main():
    # 创建tcp套接字
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 绑定端口
    s.bind(("127.0.0.1", 8080))
    # socket创建的套接字默认属性是为主动的
    # 将套接字的属性变为被动,接收发送来的数据
    s.listen(1024)
    # 当有客户端连接到服务器时,就产生一个新的套接字专门来为这个客户端服务
    # client_socket 为这个客户端服务的套接字
    # 而s则继续等待其他客户端连接
    client_socket, client_addr = s.accept()
    # 接收数据
    recv_data = client_socket.recv(1024)
    print("从%s接收到的数据为:%s" % (client_addr, recv_data.decode("utf-8")))
    # 返回数据到客户端
    client_socket.send("收到啦!".encode("utf-8"))
    # 关闭服务于这个客户端的套接字,关闭后,就意味着只能重新连接才能再次开启服务
    client_socket.close()


if __name__ == "__main__":
    main()

クライアント

#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:tcp 套接字客户端
import socket


def main():
    # 创建tcp套接字
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 连接服务器
    s.connect(("127.0.0.1", 8080))
    # 发送数据
    send_msg = input("请输入要发送的信息:")
    s.send(send_msg.encode("utf-8"))
    # 接收数据
    recv_data = s.recv(1024)
    print("从服务器接收到的数据为:%s" % recv_data.decode("utf-8"))
    # 关闭套接字
    s.close()


if __name__ == "__main__":
    main()

無限ループは、サーバ側でメッセージの受信周期を添加してもよいです。ここでは説明しません。なお、

  • TCPサーバは、バインドする必要がありそうでない場合、クライアントは、サーバー接続できません
  • イニシアチブは、サーバーがリンクされているので、TCPクライアントは、一般的にランダムにこれだけのローカルクライアントのように必ず良いサーバのIP、ポート、およびその他の情報を作成、することができます結合されていません
  • ソケットを介してソケットサーバーを聞くTCPイニシアチブから作成することができ、TCPサーバを実行するときに、これが行われなければならない、受動的になります
  • クライアントがリンクサーバーを必要とするとき、あなたは接続リンクに必要な、UDPはあるが、必要性は、直接リンクされていないが、TCPリンク、通信の成功へのリンクだけでなければなりません
  • クライアントがサーバーに接続するTCPと、サーバーは新しいソケットになり、ソケットがクライアントをマークするために使用され、クライアントサービスが個別にあり
  • パッシブソケットの後、新しいクライアントのリンク要求を受信するためのソケットを聞き、そして新しいソケットは、この新しいクライアントマーカーを受け入れる返します
  • 近くには、ソケットを聞いた後、平均パッシブソケットが閉じられ、新しいクライアントにつながるリンクサーバーにできませんが、以前にクライアントの成功をリンクされている適切に通信します。
  • 閉じるクライアントがサービスを完了したことをソケット手段のリターンを受け入れます
  • サーバはクライアントがオフラインで返されるデータの長さを持っているかどうかを判別することができるので、近いクライアントソケット呼び出し、RECVサーバは、ソリューションを詰まらせるだろう、と返された長さがゼロのとき

エピローグ

このソケットプログラミングについての上にあります。
エラーがある場合、私の記事を見つけるか、何かいいアイデアは、私に連絡することができている場合は、私たちが一緒に進行一緒に勉強し、私のメールアドレスは[email protected]です

のは、これらの複数の操作を行いましょう!

公開された26元の記事 ウォンの賞賛2 ビュー2340

おすすめ

転載: blog.csdn.net/qq_42909545/article/details/103180813