• 网络编程


    UDP介绍

    每个Ip地址包括两部分:网络地址和主机地址

    知名端口号:0 - 1023。不能随便用,有特殊用途。

    1024到65535,随便用。

     udp实现发送数据

    import socket
    
    
    def main():
        # 创建套接字
        udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        # 发送的数据
        content = input("请输入你要发送的内容:")
        # 目标地址
        desk_addr = ("127.0.0.1", 8080)
        # 发数据
        udp_socket.sendto(content.encode("utf-8"), desk_addr)
        # 关闭套接字
        udp_socket.close()
    
    
    if __name__ == "__main__":
        main()

     udp实现接收数据

    import socket
    
    
    def main():
        # 创建套接字
        udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        # 本地端口
        local_addr = ("", 7788)  # ip地址不写表示本机任意一个ip
        # 绑定本地端口
        udp_socket.bind(local_addr)
        # 接收数据
        rev_data = udp_socket.recvfrom(1024)  # 1024表示本次接受的最大字节数
        # 打印数据.(接受到的是一个元组)
        rev_msg = rev_data[0]  # 接收到的数据
        send_addr = rev_data[1]  # 发送方的地址
        print("%s: %s" % (str(send_addr), rev_msg.decode("gbk")))  # windows的编码方式是gbk
        udp_socket.close()
    
    
    if __name__ == "__main__":
        main()

    单工:类似于收音机

    半双工:类似于对讲机

    全双工:类似于手机

    socket属于全双工


    TCP介绍

    udp和tcp的区别:udp类似写信模型,每次通信都要带上ip地址和端口等。有可能丢数据,不安全。

    tcp类似于打电话,建立连接过程比udp复杂,但是安全。

    # tcp-client
    import socket
    
    def main():
        tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        server_ip = ""
        server_port = 8080
        # 连接服务器
        tcp_socket.connect((server_ip, server_port))
        send_data = input("请输入你要发送的数据")
        # 发送数据
        tcp_socket.send(send_data.encode("utf-8"))
        # 接受数据
        rev_data = tcp_socket.recv(1024)
        print(rev_data.decode("gdb"))
        tcp_socket.close()
    
    
    if __name__ == "__main__":
        main()

    # tcp_server
    import socket
    
    
    def main():
        tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        tcp_server.bind("", 7788)
        # 监听套接字,负责 等待有新的客户端进行连接
        tcp_server.listen(128)  # 让默认的套接字由主动变为被动
        # client_addr为连接的客户端地址
        # accept产生的新的套接字用来为客户端服务
        new_client_socket, client_addr = tcp_server.accept()
        # 接收数据
        recv_data = new_client_socket.recv(1024)
        print(recv_data)
        # 发送数据
        new_client_socket.send("hahaha".encode("utf-8"))
        new_client_socket.close()
        tcp_server.close()
    
    
    if __name__ == "__main__":
        main()

    跟udp的区别就是多了监听listen,而且用accept接受连接,产生新的套接字用来为客户端服务

    同时为多个客户端服务

    # tcp-server
    import socket
    
    
    def main():
        tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        tcp_server.bind("", 7788)
        # 监听套接字,负责 等待有新的客户端进行连接
        tcp_server.listen(128)  # 让默认的套接字由主动变为被动
        # client_addr为连接的客户端地址
        # accept产生的新的套接字用来为客户端服务
        while True:
            new_client_socket, client_addr = tcp_server.accept()
            while True:
                # 接收数据
                recv_data = new_client_socket.recv(1024)
                print(recv_data)
                # 如果recv解堵塞,那么有2种方式:
                # 1、客户端发送过来数据
                # 2、客户端调用close()导致了这里recv解堵塞
                if recv_data:
                    # 发送数据
                    new_client_socket.send("hahaha".encode("utf-8"))
                else:
                    break
            new_client_socket.close()
    
        tcp_server.close()
    
    
    if __name__ == "__main__":
        main()

     

    客户端解堵塞的情况:1、接收到数据;2、调用close()关闭连接。

    可以通过数据是否为空判断是哪种类型

    udp:                                tcp(client)                               tcp(server)
    socket                              socket                                    socket
    bind                                conect                                    bind
    sendto/recvfrom                     send/recv                                 listen                                                                            
    close                               close                                     accept  
                                                                                  recv/send
                                                                                  close                                                                       
  • 相关阅读:
    视频输入 范例
    视频输出 范例
    开启VI视频输入设备 范例
    初始化MMP系统 范例
    Git 的使用
    DVS/DVR/NVR/XVR
    shell命令中 && 和 || 的区别
    码流 / 码率 / 比特率 / 帧速率 / 分辨率 / 高清
    DNS与DSN
    ob_start()失效与phpunit的非正常结束
  • 原文地址:https://www.cnblogs.com/linyuhong/p/10015425.html
Copyright © 2020-2023  润新知