套接字基础与UDP通信

  • 套接字和UDP
  • Python实现套接字编程
    • 了解Ping命令
    • 服务器端程序
    • 客户机端程序
    • 运行程序步骤
    • 测试运行结果
  • 问题及解决方法
  • 代码提取

套接字和UDP

   套接字是网络中不同主机上的应用进程之间的双向通信的端点。每个套接字由一个IP地址和一个端口号组成。套接字采用客户机-服务器架构。服务器监听指定的端口等待客户的请求。服务器收到请求后,接受来自客户机套接字的连接,完成客户机与服务器的连接。小于1024的端口已经被占用,因此我们可选用的端口号范围为(1024,65535)。
   UDP是一种只提供了无连接通信,且不对传送的数据包进行可靠性保证的传输层协议。UDP无需在客户机和服务器之间建立连接,客户机向服务器发送请求报文,服务器接收请求报文,向客户机发送响应报文,关闭套接字连接,客户机接受响应报文。

Python实现套接字编程

   Python中提供了socket模块用于套接字编程,socket方法可以直接创建一个套接字,需要两个参数协议(AF_INET:IPV4,AF_INET6:IPV6)和套接字类型(SOCK_STREAM:TCP协议,SOCK_DGRAM:UDP协议)。同时服务器端需要用.bind()方法绑定主机IP和端口号。使用UDP发送数据时只能发送ASCII编码的数据,并且发送的数据必须是字节类型,所以在发送数据时可以使用.encode()方法改变字节编码。.sendto()和.recvfrom()方法用来发送和接收数据并且需要设置最大的字节数。

了解Ping命令

   Ping是一种计算机网络工具,用来测试数据包能否发送到指定的主机。其原理是向目标主机发送请求报文,并等待接受响应报文,通过发送多个报文,可以计算丢包率和网络实验。
   可利用Windows的命令行程序(Win+R,输入cmd即可)进行Ping命令。
   (1)Ping谷歌官网(不可达,数据包丢失)

  (2)Ping百度官网

  (3)ping本主机

  注:如何查看本主机IP:在命令行程序中输入 ipconfig /all即可

服务器端程序

# UDP服务器程序:UDPServer.py
# 服务器IP:192.168.0.106
# 客户机IP:192.168.0.103
import random
from socket import *
serverSocket = socket(AF_INET, SOCK_DGRAM)    # 创建服务器套接字
serverSocket.bind(('', 6121))                 # 绑定服务器套接字和端口号
print("服务器已启动......")
while True: // 等待客户机的请求rand = random.randint(0, 10)    # 生成随机数,用于模拟概率丢包/超时message, address = serverSocket.recvfrom(2048)    # 接收客户机的请求报文print("报文 '",message.decode(), "' 接收成功", sep="")if rand < 4:     # 以一定的概率模拟超时print()continueserverSocket.sendto(message.decode().upper().encode(), address)     # 发送响应报文print("报文 '", message.decode().upper(), "' 发送成功\n", sep="")      # 打印响应报文发送成功

  服务器端程序代码解析:生成服务器套接字 serverSocket,绑定服务器主机与指定的端口号(此处端口号选用6121),服务器保持等待,等待客户机请求。接收到客户机报文后,以一定概率rand模拟超时丢包,如果rand小于4则让服务器不发生响应报文;否则服务器回传响应报文。

客户机端程序

# UDP客户机程序:UDPClient.py
# 服务器IP:192.168.0.106
# 客户机IP:192.168.0.103
import time
import numpy as np
from socket import *
# 客户机端套接字设置
clientSocket = socket(AF_INET, SOCK_DGRAM)   # 创建客户机套接字
clientSocket.settimeout(1)  # 设置的最大等待时间
serverName = "192.168.0.106"       # 服务器主机
message = ["lxy","hny","python","test","deeplearning","net","face","love","hahaha","lalala"]    # 发送10个Ping报文
success = []      # 存放接收成功的Ping报文对应的时延
print("正在 Ping",serverName,"具有 51 字节的数据:")
# 发送报文
for i in range(10):clientSocket.sendto(message[i].encode(), (serverName,6121))   # 发送Ping报文start = time.perf_counter()    # 计时开始try:modifiedMessage,serverAddress = clientSocket.recvfrom(2048)   # 等待接收响应Pong报文end = time.perf_counter()  # 计时结束print("来自 ", serverName, " 的回复:报文='", modifiedMessage.decode(),"', 字节=",len(message[i]), ", 时延RTT=", end - start, "s。", sep="")success.append(end-start)   # 将成功接收响应报文对应的时延保存except :     # 异常抛出,程序继续运行print("[Error]:请求超时")
clientSocket.close()    # 关闭客户机套接字## 打印 Ping 的统计信息
print("\n",serverName,"的 Ping 统计信息:\n    数据包:已发送=10 ,已接受=%d ,丢失=%d (%d%% 丢失)"%(len(success),10-len(success),100*(1-len(success)/10)))
if len(success)>0:print("往返行程的估计时间(以秒为单位):\n    最短=%6fs,最长=%6fs,平均=%7fs"%(min(success),max(success),np.mean(success)),sep="")

  客户机端程序代码解析:生成客户机套接字,基于服务器主机(使用“127.0.0.1”或者使用IP:192.168.0.103)和端口号向服务器发送10次Ping报文,保持静默等待服务器回复;若客户机能够接收到响应报文则计算时延和输出报文,若不能接收到Pong报文则输出“请求超时”;发送10次Ping报文后,统计10次Ping报文的丢包率和时延。
  注:程序中使用time.perf_counter()计时,而不是time.time()是因为前者精度更高。

运行程序步骤

(1)运行服务器程序UDPServer.py,保持服务器在正常工作中,即不能终止程序。
(2)运行客户机程序UDPClient.py

测试运行结果

(1)客户机程序和服务器程序在同一主机上运行(左为服务器控制台输出,右为客户机控制台输出)

(2)客户机程序和服务器程序在不同主机上运行(左为服务器控制台输出,右为客户机控制台输出)

问题及解决方法

(1)报错:Socket.gaierror: [Error 11001] getaddrinfo failed
  主机IP有误,应该选用主机IP而不是主机名
(2)报错:Socket.timeout: timed out
  报错的原因是settimeout()函数遇到错误是会直接报错而终止程序的运行的,所以应该加上try……except将异常抛出而不让该函数报错,影响程序的正常运行。
(3)客户机向服务器发送10个Ping报文中,若第一个报文是被服务器忽略而不回复时,客户机程序不会运行下去。
  settimeout(1)设置最大等待时间函数的定义位置不准确,一开始是将该定义放在了recvfrom()函数后,正确的做法应该将这个超时异常提前定义。

代码提取

  相关代码可在https://github.com/Hny1216/Socket_UDP.git上提取

套接字基础与UDP通信相关推荐

  1. python-套接字基础与 UDP 通信

    一 . 实验目的 熟悉基于 Python 进行 UDP 套接字编程的基础知识,掌握使用 UDP 套接字发送和接收数据包,以及设置正确的套接字超时,了解 Ping 应用程序的基本概念,并理解其在简单判断 ...

  2. 学习笔记(06):Python网络编程并发编程-在简单套接字基础上加上通信循环

    立即学习:https://edu.csdn.net/course/play/24458/296235?utm_source=blogtoedu 1.服务器端 #以打电话通讯为例子进行说明 #导入相应的 ...

  3. Python开发基础----异常处理、socket套接字基础1

    异常处理 错误 程序里的错误一般分为两种: 1.语法错误,这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正 2.逻辑错误,人为造成的错误,如数据类型错误.调用方法错误等,这些解 ...

  4. 基本套接字TCP和UDP

    TCP的Java支持 协议相当于相互通信的程序间达成的一种约定,它规定了分组报文的结构.交换方式.包含的意义以及怎样对报文所包含的信息进行解析,TCP/IP协议族有IP协议.TCP协议和UDP协议.现 ...

  5. Linux网络编程之套接字基础

    Linux网络编程之套接字基础 1.套接字的基本结构 struct sockaddr 这个结构用来存储套接字地址. 数据定义: struct sockaddr { unsigned short sa_ ...

  6. 本地套接字(domain)通信

    本地套接字(domain)通信 socket IPC 对比网络套接字 本地套接字实现通信 通信流程 服务端程序 客户端程序 运行结果 socket IPC   socket API原本是为网络通讯设计 ...

  7. 网络编程(part10)--socket套接字编程之UDP套接字

    鄙人学习笔记 文章目录 UDP套接字编程 服务端流程 举个例子 客户端流程 举个例子 TCP套接字和UDP套接字编程区别 UDP套接字编程 服务端流程 创建数据报套接字 sockfd = socket ...

  8. 网络基础:套接字编程,UDP和TCP通信程序

    文章目录 字节序 套接字编程 客户端与服务端 ★ netstat命令 ★ UDP通信程序 通信流程: 接口: 流程外的重要接口: 服务端代码 客户端代码 TCP通信程序 通信流程: 接口: 代码实例: ...

  9. 网络编程(socket)套接字之基于udp的套接字

    基于udp的网络编程 特点:不需要提前建立链接,每次收发都需要获取ip和端口 又称数据报协议,一次发送对应一次接收,不会产生粘包问题    不可靠传输,发送数据不需要回复ACK确认信息    没有链接 ...

最新文章

  1. 求均值方差_协方差,方差,标准差
  2. 从配置服务器说起......
  3. Elam的caffe笔记之配置篇(一):CentOS6.5编译安装gcc4.8.2
  4. 【数据结构与算法】之深入解析“组合总和II”的求解思路与算法示例
  5. 第17课 欧耶欧耶 《小学生C++趣味编程》
  6. c语言编程新思路知道答案,C语言编程新思路_知道答案公众号免费
  7. 湖南2021年高考成绩查询与录取查询课件,@所有高考生,高考成绩和录取动态查询方式公布...
  8. 2020蓝桥杯校内模拟赛1-5(详细版本,看完就会)
  9. 一周最新示例代码回顾 (4/9–4/15)
  10. 图解设计模式:行为型模式之观察者模式
  11. 学习笔记-Matlab算法篇-动态规划
  12. Kinetis系列单片机(飞思卡尔,NXP )单片机唯一ID获取
  13. 每个人都能 DIY 的 苹果电脑
  14. CSS3动画入门 CSS动画如何使用(举例说明)
  15. 01数据分析与Excel
  16. MFSPV: A Multi-Factor Secured and Lightweight Privacy-Preserving Authentication Schem
  17. 正式赛1010 羊村村长选举
  18. 外贸找客户软件:Email Extractor Pro 7.2.X
  19. 计算机主机麦克风三个孔,台式机耳机和麦克风怎么通用一个插孔
  20. 不看公式自己复原魔方

热门文章

  1. 第三章 SQL命令 ALTER USER
  2. Cocos Creator:高效率内容生产,引领全平台制霸!
  3. 人工智能期末考试复习(贲可荣 张彦铎)
  4. becon帧 wifi_无线路由器Beacon时槽值设置为100同500有什么区别?是不是设置越高WIFI信号的传输距离就越远越强?...
  5. XSS插入绕过一些方式总结
  6. 萌宠历险记html5游戏在线玩,7724萌宠历险记
  7. 直通车推广有哪些容易被忽略的地方
  8. windows怎样连接到linux桌面,Windows远程桌面连接Ubuntu 14.04
  9. 二元加权电容器阵列的构造性共质心布局与布线
  10. 为什么 50 欧姆成为了射频传输线的阻抗标准