zoukankan      html  css  js  c++  java
  • 基于UDP协议的套接字编程

    基于udp协议的套接字编程

    • UDP是无链接的,先启动那一端都不会报错
    • UDP协议是数据报协议,发空的时候也会自带报头,因此客户端输入空,服务端也能收到
    • 一般不用与传输大数据
    • 虽然没有粘包问题,但是不能替代TCP套接字,因为UDP协议有一个缺陷:如果数据发送的途中,数据丢失,则数据就真的丢失了,而TCP协议则不会出现这种缺陷,因此一般UDP套接字用于无关紧要的数据发送,列如QQ聊天。

    服务端

    import socket
    
    server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    server.bind(('127.0.0.1',8080))
    
    while True:
        data,client_addr=server.recvfrom(1024)
        print('-->',data,client_addr)
        server.sendto(data.upper(),client_addr)
       
    server.close()
    

    客户端

    import socket
    
    client=socket.socket(socket.AF_INET,socket.SOCK_FGRAM) #数据报协议->UDP
    
    while True:
        msg=input('>>>')
        client.sendto(msg.encode('utf-8'),('127.0.0.1',8080))
        data,server_addr=client.recvfrom(1024)
        print(data)
        
    client.close()
    

    qq聊天

    服务端

    __author__='nick'
    import socket
    ip_port=('127.0.0.1',8081)
    UDP_server_sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    UDP_server_sock.bind(ip_port)
    while True:
        qq_msg,addr=UDP_server_sock.recvfrom(1024)
        print(f'来自{addr[0]:addr[1]}的一条消息:{qq_msg.decode('utf-8')}')
        back_msg=input('回复消息:').strip()
    
        UDP_server_sock.sendto(back_msg.encode('utf-8'),addr)
    

    客户端1

    __author__='zhaojiahao'
    import socket
    BUFSIZE=1024
    UDP_client_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    
    qq_name_dic={
        '狗哥alex': ('127.0.0.1', 8081),
        '瞎驴': ('127.0.0.1', 8081),
        '一棵树': ('127.0.0.1', 8081),
        '武大郎': ('127.0.0.1', 8081),
    }
    
    while True:
        qq_name=input('请选择聊天对象:')
    	while True:
            msg=input('请输入消息,回车发送:')
    		if msg=='quit':break
    		if not msg or not qq_name or qq_name not in qq_name_dic:continue
            UDP_client_socket.sendto(msg.encode('utf-8'),qq_name_dic[qq_name])
            
            back_msg,addr=UDP_client_socket.recvfrom(BUFSIZE)
            print('来自[%s:%s]的一条消息:33[1;44m%s33[0m' %
                  (addr[0], addr[1], back_msg.decode('utf-8')))
    UDP_client_socket.close()
    

    客户端2

    #_*_coding:utf-8_*_
    __author__ = 'nick'
    import socket
    BUFSIZE = 1024
    UDP_client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    
    qq_name_dic = {
        '狗哥alex': ('127.0.0.1', 8081),
        '瞎驴': ('127.0.0.1', 8081),
        '一棵树': ('127.0.0.1', 8081),
        '武大郎': ('127.0.0.1', 8081),
    }
    
    while True:
        qq_name = input('请选择聊天对象: ').strip()
        while True:
            msg = input('请输入消息,回车发送: ').strip()
            if msg == 'quit': break
            if not msg or not qq_name or qq_name not in qq_name_dic: continue
            UDP_client_socket.sendto(msg.encode('utf-8'), qq_name_dic[qq_name])
    
            back_msg, addr = UDP_client_socket.recvfrom(BUFSIZE)
            print('来自[%s:%s]的一条消息:33[1;44m%s33[0m' %
                  (addr[0], addr[1], back_msg.decode('utf-8')))
    
    UDP_client_socket.close()
    
  • 相关阅读:
    pythonday06数据类型(四)
    pythonday05数据类型(三)
    pythonday04数据类型(二)
    pythonday03数据类型(一)
    Apollo自动驾驶实践——第0讲:导论
    图论学习:生成树的Matrix-tree定理
    2020杭电多校6 Expectation
    2020牛客暑期多校第九场 B Groundhog and Apple Tree
    图论:二分图最大权匹配KM算法
    第十章 百度Apollo实战
  • 原文地址:https://www.cnblogs.com/zhoajiahao/p/11097694.html
Copyright © 2011-2022 走看看