一、UDP套接字简单示例

1.1 服务端

  1. import socket
  2. server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 数据报协议-》UDP
  3. server.bind(('127.0.0.1', 8080))
  4. while True:
  5. data, client_addr = server.recvfrom(1024)
  6. print('===>', data, client_addr)
  7. server.sendto(data.upper(), client_addr)
  8. server.close()

二、客户端

  1. import socket
  2. client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 数据报协议-》UDP
  3. while True:
  4. msg = input('>>: ').strip() # msg=''
  5. client.sendto(msg.encode('utf-8'), ('127.0.0.1', 8080))
  6. data, server_addr = client.recvfrom(1024)
  7. print(data)
  8. client.close()
  • UDP是无链接的,先启动哪一端都不会报错

  • UDP协议是数据报协议,发空的时候也会自带报头,因此客户端输入空,服务端也能收到

三、UPD套接字无粘包问题

3.1 服务端

  1. import socket
  2. server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 数据报协议-》udp
  3. server.bind(('127.0.0.1', 8080))
  4. data, client_addr = server.recvfrom(1024) # b'hello'==>b'h'
  5. print('第一次:', client_addr, data)
  6. data, client_addr = server.recvfrom(1024) # b'world' =>b'world'
  7. print('第二次:', client_addr, data)
  8. #
  9. # data,client_addr=server.recvfrom(1024)
  10. # print('第三次:',client_addr,data)
  11. server.close()

3.2 客户端

  1. import socket
  2. client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 数据报协议-》udp
  3. client.sendto('hello'.encode('utf-8'), ('127.0.0.1', 8080))
  4. client.sendto('world'.encode('utf-8'), ('127.0.0.1', 8080))
  5. # client.sendto(''.encode('utf-8'),('127.0.0.1',8080))
  6. client.close()
  • UPD协议一般不用于传输大数据。

  • UDP套接字虽然没有粘包问题,但是不能替代TCP套接字,因为UPD协议有一个缺陷:如果数据发送的途中,数据丢失,则数据就丢失了,而TCP协议则不会有这种缺陷,因此一般UPD套接字用户无关紧要的数据发送,例如qq聊天。

四、qq聊天

  • 由于UDP无连接,所以可以同时多个客户端去跟服务端通信

4.1 服务端

  1. #_*_coding:utf-8_*_
  2. __author__ = 'nick'
  3. import socket
  4. ip_port = ('127.0.0.1', 8081)
  5. UDP_server_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #买手机
  6. UDP_server_sock.bind(ip_port)
  7. while True:
  8. qq_msg, addr = UDP_server_sock.recvfrom(1024)
  9. print('来自[%s:%s]的一条消息:\033[1;44m%s\033[0m' %
  10. (addr[0], addr[1], qq_msg.decode('utf-8')))
  11. back_msg = input('回复消息: ').strip()
  12. UDP_server_sock.sendto(back_msg.encode('utf-8'), addr)

4.2 客户端1

  1. #_*_coding:utf-8_*_
  2. __author__ = 'nick'
  3. import socket
  4. BUFSIZE = 1024
  5. UDP_client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  6. qq_name_dic = {
  7. '狗哥alex': ('127.0.0.1', 8081),
  8. '瞎驴': ('127.0.0.1', 8081),
  9. '一棵树': ('127.0.0.1', 8081),
  10. '武大郎': ('127.0.0.1', 8081),
  11. }
  12. while True:
  13. qq_name = input('请选择聊天对象: ').strip()
  14. while True:
  15. msg = input('请输入消息,回车发送: ').strip()
  16. if msg == 'quit': break
  17. if not msg or not qq_name or qq_name not in qq_name_dic: continue
  18. UDP_client_socket.sendto(msg.encode('utf-8'), qq_name_dic[qq_name])
  19. back_msg, addr = UDP_client_socket.recvfrom(BUFSIZE)
  20. print('来自[%s:%s]的一条消息:\033[1;44m%s\033[0m' %
  21. (addr[0], addr[1], back_msg.decode('utf-8')))
  22. UDP_client_socket.close()

4.3 客户端2

  1. #_*_coding:utf-8_*_
  2. __author__ = 'nick'
  3. import socket
  4. BUFSIZE = 1024
  5. UDP_client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  6. qq_name_dic = {
  7. '狗哥alex': ('127.0.0.1', 8081),
  8. '瞎驴': ('127.0.0.1', 8081),
  9. '一棵树': ('127.0.0.1', 8081),
  10. '武大郎': ('127.0.0.1', 8081),
  11. }
  12. while True:
  13. qq_name = input('请选择聊天对象: ').strip()
  14. while True:
  15. msg = input('请输入消息,回车发送: ').strip()
  16. if msg == 'quit': break
  17. if not msg or not qq_name or qq_name not in qq_name_dic: continue
  18. UDP_client_socket.sendto(msg.encode('utf-8'), qq_name_dic[qq_name])
  19. back_msg, addr = UDP_client_socket.recvfrom(BUFSIZE)
  20. print('来自[%s:%s]的一条消息:\033[1;44m%s\033[0m' %
  21. (addr[0], addr[1], back_msg.decode('utf-8')))
  22. UDP_client_socket.close()

4.4 运行结果

  • 服务端运行结果

  • 客户端1运行结果

  • 客户端2运行结果

基于UDP协议的socket套接字编程的更多相关文章

  1. 基于TCP协议的socket套接字编程

    目录 一.什么是Scoket 二.套接字发展史及分类 2.1 基于文件类型的套接字家族 2.2 基于网络类型的套接字家族 三.套接字工作流程 3.1 服务端套接字函数 3.2 客户端套接字函数 3.3 ...

  2. Learning-Python【30】:基于UDP协议通信的套接字

    UDP协议没有粘包问题,但是缓冲区大小要足够装数据包大小,建议不要超过 512 服务端: # 服务端 import socket server = socket.socket(socket.AF_IN ...

  3. 网络编程——TCP协议、UDP协议、socket套接字、粘包问题以及解决方法

    网络编程--TCP协议.UDP协议.socket套接字.粘包问题以及解决方法 TCP协议(流式协议) ​ 当应用程序想通过TCP协议实现远程通信时,彼此之间必须先建立双向通信通道,基于该双向通道实现数 ...

  4. 基于TCP连接的socket套接字编程

    基于TCP协议的套接字编程(简单) 服务端 import socket server = socket.socket() server.bind( ('127.0.0.1', 9999) ) serv ...

  5. 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

    Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...

  6. linux网络环境下socket套接字编程(UDP文件传输)

    今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...

  7. linux网络编程-(socket套接字编程UDP传输)

    今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...

  8. python 全栈开发,Day34(基于UDP协议的socket)

    昨日内容回顾 网络的基础概念arp协议 :通过ip地址找到mac地址五层模型 : 应用层 传输层 网络层 数据链路层 物理层tcp协议 : 可靠的 面向连接 全双工 三次握手 四次挥手udp协议 : ...

  9. socket套接字编程 HTTP协议

    socket套接字编程  套接字介绍  1. 套接字 : 实现网络编程进行数据传输的一种技术手段  2. Python实现套接字编程:import  socket  3. 套接字分类 >流式套接 ...

随机推荐

  1. Android Studio 第一个Android项目

    创建步骤 Start a new Android Studio project 选择 Empty Activity   设置Android项目的名称.位置,开发语言 打开初始界面 初步认识Androi ...

  2. React每隔0.2s颜色变淡 之settimeOut变成setInterval

    案例 每隔0.2s颜色变淡 公共数据是放在state中的哦! 代码如下 import React, { Component } from "react"; import { set ...

  3. R-5 相关分析-卡方分析

    本节内容: 1:相关分析 2:卡方分析 一.相关分析 相关系数: 皮尔逊相关系数:一般用来计算两个连续型变量的相关系数. 肯德尔相关系数:一个连续一个分类(最好是定序变量) 斯皮尔曼相关系数:2个变量 ...

  4. 花了三个月终于把所有的 Python 库全部整理了!可以说很全面了

    库名称简介 Chardet字符编码探测器,可以自动检测文本.网页.xml的编码. colorama主要用来给文本添加各种颜色,并且非常简单易用. Prettytable主要用于在终端或浏览器端构建格式 ...

  5. JSON.parse解决Unexpected token ' in JSON at position 1报错

     壹 ❀ 引 我们知道JSON.parse能将JSON字符串转变成JS对象,但在一些转换中可能出现Unexpected token ' in JSON at position 1的错误,这是因为被转换 ...

  6. 解决python安装第三方库超时问题

    这里说明一下,配置文件中的url还可以换成下面的URL 阿里云 http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.u ...

  7. POJ-2018 Authors Register Update your info Authors ranklist

    Best Cow Fences Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 16945   Accepted: 5425 ...

  8. linux命令--网络命令

    一.网络命令 1.配置ip 1.1 配置 IP 地址 IP 地址是计算机在互联网中唯一的地址编码.每台计算机如果需要接入网络和其他计算机进行数 据通信,就必须配置唯一的公网 IP 地址. 配置 IP ...

  9. C#时间戳与时间相互转换

    代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...

  10. C#中 EF 性能优化

    https://www.cnblogs.com/chenwolong/p/7531955.html EF使用AsNoTracking(),无跟踪查询技术(查询出来的数据不可以修改,如果你做了修改,你会 ...