基于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]的一条消息:\033[1;44m%s\033[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]的一条消息:\033[1;44m%s\033[0m' %
              (addr[0], addr[1], back_msg.decode('utf-8')))

UDP_client_socket.close()

转载于:https://www.cnblogs.com/zhoajiahao/p/11097694.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值