import argparse,socket
from datetime import datetime MAX_BYTES = 65535 def server(port):
sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #协议族AF_INET以及数据报类型SOCK_DGRAM.SOCK_DGRAM表示在IP网络上使用UDP协议
#要注意的是数据报datagram而不是数据包packet,用了表示应用层数据块传输的官方术语
sock.bind(('127.0.0.1',port)) #绑定一个UDP网络地址:一个二元组,包含一个IP地址和一个整形的UDP端口号
#端口号要大于1023,否则要管理员权限
print('Listening at {}'.format(sock.getsockname())) #查询套接字当前绑定的IP地址和端口号
while True: #会进入一个循环不断运行recvfromO
data,adress = sock.recvfrom(MAX_BYTES) #最长可接收65535字节的信息,也是UDP数据报可包含的最大长度,没有接收到永远等待
#一旦接收到数据报,返回两个值。1 发送该数据报的客户端地址 2 以字节表示数据报的内容
text = data.decode('ascii')
print('The client at {} says {!r}'.format(adress,text))
text = 'Your data was {} bytes long'.format(len(data))
data = text.encode('ascii')
sock.sendto(data,adress) def client(port):
sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
text = 'The time is {}'.format(datetime.now())
data = text.encode('ascii')
sock.sendto(data,('127.0.0.1',port)) #两个信息:要发送的信息和目标地址。这是向服务器发送数据报的唯一调用
print('The OS assigned me the adress {}'.format(sock.getsockname()))
data,adress = sock.recvfrom(MAX_BYTES)
text = data.decode('asicc')
print('The serve {} replied {!r}'.format(adress,text))
if __name__ == '__main__':
choices = {'client':client,'server':server}
parser = argparse.ArgmentParser(description='Send and receive UDP locally')
parser.add_argument('role',choices = choices ,help = 'which role to play')
parser.add_argument('-p',metavar = 'PORT',type = int ,default = 1060,
help = 'UDP port (default 1060)')
args = parser.parse_args()
function = choices[args.role]
function(args.p)

最新文章

  1. SharePonit 2010 更改另存为列表模板的语言类型
  2. jQuery中width、innerWidth、outerWidth的区别
  3. 【整理】--【字符设备】cdev_init()/cdev_alloc(),cdev_add(),cdev_del()
  4. 【目录】Newlife XCode组件相关文章目录
  5. Linux入侵检测工具 - RKHunter
  6. (转)Eclipse平台技术概述
  7. awk文本处理知识汇总
  8. CKEditor如何统计文字数量
  9. javaScript 类型判断
  10. Ehcache 整合Spring 使用页面、对象缓存(转载)
  11. Android Studio的使用(八)--// TODO代码
  12. cocos 射线检测 3D物体 (Sprite3D点击)
  13. netsh自动配置网络
  14. 自己写的一个用js把select换成div与span与ul的东西
  15. 痞子衡嵌入式:ARM Cortex-M内核那些事(3)- 功能模块
  16. 爬虫_微信小程序社区教程(crawlspider)
  17. web自动化测试---概述
  18. mysql从库Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'报错处理
  19. 编写一个程序解决选择问题。令k=N/2。
  20. 大数据hadoop与spark的区别

热门文章

  1. 用Eclipse和Tomcat搭建一个本地服务器
  2. 力扣208——实现 Trie (前缀树)
  3. linux下配置vnc-server 和gnome-session
  4. 结巴分词 java 高性能实现,是 huaban jieba 速度的 2倍
  5. docker学习1--dockerfile
  6. 趣谈编程史第2期-这个世界缺少对C语言的敬畏,你不了解的C语言科普
  7. axios全局引用
  8. CF449B Jzzhu and Cities 迪杰斯特拉最短路算法
  9. 解决a 标签 和 div 标签高度超出的问题
  10. .NET使用FastDBF写入DBF