zoukankan      html  css  js  c++  java
  • 一、网络编程-UDP传输协议及socket套接字使用

    知识点基本介绍:1、网络通信协议一般就是UDP和TCP俩种传输协议,这一章先说UDP,UDP是一种比较简单的传输协议,如qq使用的就是UDP

                  2、ip:ip就是标记网络中中的一台电脑,目前我们使用的都是ipv4,在公网中,每台电脑都有一个唯一的IP地址,目前ipv4已经被分配完了,大家在ipconfig的时候见过ipv6,它能给更多的电脑分配IP地址,号称给地球上每一粒沙子都分配一个地址都用不完,目前是用不到的,因为网络运营商搭建网络时配置都配好了,不可能重新去换ipv6.

              3、端口:日常中,我们发送一条消息给另一台电脑上的程序,是怎么运作的呢?先是根据ip找到那台电脑,但是我要发给那个程序呢?所以也要给每个电脑绑定一个标识,这个标识就是端口   

    1、如何使用UDP协议发送消息给另外一个程序?这就要使用编程中socket套接字,它是开发网络编程一个接口,调用其中封装的方法就可以实现发送消息。既然发送给另外一个程序,那么这里需要用到一个小工具,网络调试助手,如图:

    下面使用socket给助手发消息,代码如下,方法使用详情看注解:

    
    
    import socket

    # 发送消息给另外一个程序
    def send_main():
    # 创建套接字
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 创建套接字需要传递俩个参数,第一个参数是ip地址类型,第二个参数是传输协议
    # 我这里AF_INET代表ipv4,SOCK_DGRAM代表udp协议

    udp_socket.bind(('', 7789)) # 参数传递的是元祖。第一个值是ip,因为绑定的是本地的,所以可以不写,第二个值是端口。将套接字绑定地址和端口,作用就是当我使用这个套接字发送消息时,接受方看到的端口一直就是绑定的这个端口。
    # 不绑定也没关系,去掉这句代码后,发送消息时,会自动为该程序绑定一个随机端口,那么每次启动程序去发消息时,对方看到都是不一样的端口

    while True: # 让程序一直停留在发送数据界面
    # 发送数据
    # udp_socket.sendto(b'hihihi', ('192.168.2.151',8080)) # 调用sendto方法发送数据,接受的第一参数值是发送的内容,第二个参数是一个元祖
    # 元祖里第一个值是接受方的ip地址,第二个值是接收方程序的端口号
    # 注意,发送内容前加一个b代表以字节的格式发送出去

    # 改进:发送内容为用户输入的,不要写死
    input_data = input('请输入数据:')
    udp_socket.sendto(input_data.encode('utf-8'), ('192.168.2.151', 8080)) # 这里将用户输入的内容要做一个编码,否则发不出去
    # 关闭套接字
    udp_socket.close()

    if __name__ == '__main__':
    send_main()

    发送消息演示图如下:

    2、接收消息:

    def receive_main():
                # 创建套接字
                udp_socket1 = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
                udp_socket1.bind(('', 7489))   # 绑定地址和端口,注意,上面发送消息时可以不绑定,但是接受方一定要绑定,否则发送方怎么知道要发给哪个ip的哪个程序
                udp_data = udp_socket1.recvfrom(1024)  # 调用revfrom方法接受数据,参数是收到的内容最大值
    
                # print(udp_data)  # 打印出接收到的数据,(b'xb9xfexb9xfexb9xfe', ('192.168.2.151', 8080)),数据是一个元祖,
                                    # 第一个值时接收到的内容,第二个值也是一个元祖,里面是发送发的ip和端口
                                    # 内容是一串乱码,这是因为作为发送方的网络调试助手使用Windows中gbk编码发送的,所以解码一下就好了
    
                print(udp_data[0].decode('gbk'))  # 我只打印内容,地址不打印
    
                udp_socket1.close()  # 关闭套接字
    
    
    if __name__ == '__main__':
           receive_main()

    接收消息演示图如下:

    下一章讲TCP协议,敬请期待。。。。。。。

  • 相关阅读:
    js获取当前网页的源码
    jquery实现点击图片全屏查看功能
    html查看大图、js查看大图
    【后端】SSM(Spring + SpringMVC + Mybatis)框架整合(二)
    【macOS】免费使用正版 Paragon NTFS for Mac(非破解)
    【后端】SSM(Spring + SpringMVC + Mybatis)框架整合(一)
    c# 自动生成N个随机数和为1
    分布式事务的解决方案
    【JUC】一些线程基础
    【工具】apng图像判定调研
  • 原文地址:https://www.cnblogs.com/lz-tester/p/9333238.html
Copyright © 2011-2022 走看看