zoukankan      html  css  js  c++  java
  • 《Python网络编程基础》第二章 读书笔记。

    第二章 UDP

    UDP称为用户数据报协议,TCP称为传输控制协议,计算机有多个端口,使用了多路复用技术,两台终端通信,必须保证数据的可靠性。

    2.1端口号

    IP只不过把数据送到了指定了主机,双方进行通信必须要有端口号,知名端口(0~1023),普通程序无法监听该端口。注册端口(1024~49151),一般建议指定服务时才使用的端口,剩下(49152到65535)当发送数据包的时候,没有指定的话,操作系统会随机生成一个。

    In [1]: import socket                                                                                             
    
    In [2]: socket.getservbyname("domain")                                                                            
    Out[2]: 53
    
    In [3]:  
    

      通过getservbyname获取dns的服务器的端口号.

    2.2套接字

    Python标准库通过对兼容posix操作系统网络操作的底层函数进行了封装,并为所有普通的原丝调用提供了一个简单的基于对象的接口。

    套接字时一个通信的端点,操作系统使用整数来标识套接字,而Python则使用socket.socket对象来表示套接字,该对象内部维护了操作系统标识套接字的整数(fileno()方法可以看到)

    #!/usr/bin/env python3
    # -*- coding: UTF-8 -*-
    
    import argparse, socket
    from datetime import datetime
    
    MAX_BYTES = 65535
    
    def server(port):
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        # 绑定端口
        sock.bind(('localhost', port))
        print("sock file no is {}".format(sock.fileno()))
        print("Listening at {}".format(sock.getsockname()))
    
        while True:
            data, address = sock.recvfrom(MAX_BYTES)
            text = data.decode('ascii')
            print('The client at {} says {!r}'.format(address, text))
            text = 'Your data was {} bytes long'.format(len(data))
            data = text.encode('ascii')
            sock.sendto(data, address)
    
    def client(port):
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        text = 'The time is {}'.format(datetime.now())
        data = text.encode('ascii')
        sock.connect(('127.0.0.1', port))
        sock.send(data)
        print('The OS assigned me the address {}'.format(sock.getsockname()))
        data, address = sock.recvfrom(MAX_BYTES)
        text = data.decode('ascii')
        print('The server {} replied {!r}'.format(address, text))
    
    if __name__ == '__main__':
        choices = {'client': client, 'server': server}
        paser = argparse.ArgumentParser(description='Send and receive UDP locally')
        paser.add_argument('role', choices=choices, help='which role to play')
        paser.add_argument('-p', metavar='PORT', type=int, default=1060,
                           help='UDP port (default 1060)')
        args = paser.parse_args()
        function = choices[args.role]
        function(args.p)
    

      上面写了示例代码:作为服务端,首先定义一个socket端口,里面填写参数,然后申请一个ip端口进行绑定,接着死循环通过recvfrom接受信息,接受的是发送者的ip端口与内容,通过sendto把信息发送给发送者

         client就比较简单,申请一个socket,通过sendto发送消息,通过recvfrom接受消息,少了一个bind死循环的需求。

  • 相关阅读:
    MSSQL复制表
    分享职场心得《7》
    分享职场心得《2》
    分享职场心得《3》
    免费收录网站搜索引擎登录入口最新版
    读写分离,读写分离死锁解决方案
    分享职场心得《5》
    分享职场心得《6》
    分享职场心得《1》
    分享职场心得《4》
  • 原文地址:https://www.cnblogs.com/sidianok/p/14104212.html
Copyright © 2011-2022 走看看