基于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()

最新文章

  1. 用Kotlin语言重新编写Plaid APP:经验教训(I)
  2. Linux中find常见用法示例
  3. opencv+vs2010
  4. cocos2dx-3.9 集成admob
  5. laravel----------------自动生成模型,控制器,视图的操作步骤。
  6. 学习KMP算法
  7. BestCoder Round #35
  8. 用javascript快速清空你的人人时间轴、状态和分享
  9. Android学习笔记(二)Manifest文件节点详解
  10. PHP_EOL常量
  11. hdoj 4552 怪盗基德的挑战书【求前缀在字符串中出现的次数之和】
  12. 关于回调(callback)
  13. 分门别类总结Java中的各种锁,让你彻底记住
  14. beta冲刺6/7
  15. LoadRunner录制脚本时没有响应——无法启动浏览器问题总结
  16. csharp:SMO run sql script
  17. 【ZZ】Linux常用指令
  18. python之virtualenv
  19. 用pyenv和virtualenv搭建单机多版本python虚拟开发环境
  20. Linux云服务器下Tomcat部署超详细

热门文章

  1. asp.net MVC项目,localhost响应时间过长
  2. vue之自定义插件
  3. css盒子模型概念
  4. 使用sqlyog工具同步两个相同结构的数据库之间的数据
  5. 分页工具一Pageable与Page
  6. Java——super关键字
  7. 42 github 开源代码 ——README.md语法/相关操作等
  8. 基于bootstrap的时间选择插件daterangepicker以及汉化方法
  9. luoguP5162 WD与积木
  10. C 函数指针详解