一.TCP半连接池原理

  半连接池的工作原理

  目前我们的程序是单线程  服务器要么处理通讯要么处理连接请求 无法同时进行

#服务器

import socket
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(("127.0.0.1",9999))
# 不是罪大连接数
server.listen(5)
while True:
c,addr = server.accept
while True:
try:
msg = c.recv(1024).decode("utf-8")
if not msg:
c.close()
break
c.send(msg.upper().encode("utf-8"))
except BaseException:
print("客户端异常断开")
c.close()
server.close() #用户端 import socket
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(("127.0.0.1",9999))
while True:
data = input(">>>:")
if not data:coninue
client.send(data.encode("utf-8")
print(msg)
client.close()

二.TCP 和 UDP 发送数据是的流程

  解释 为何TCP是可靠的 是因为发送数据后必须受到确认包

#服务器

import socket
#创建socket对象 指定type参数为socket.SOCK_DGRAM表示使用UDP协议
server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#datagram数据报的意思
# 绑定ip和端口
server.bind(("127.0.0.1",8888))
while True:
# 接受数据 返回一个元祖 数据和 发送方的地址
msg,c_adde = server.recvfrom(1024)
print("收到来自%s: 说:%s"%(c_addr[0],msg.decode("utf-8")))
# 发送数据到指定ip和端口
server.sendto(msg.upper(),c_addr) #客户端
import socket
client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
msg = input(">>>:")
client.sendto(msg.encode("utf-8"),("127.0.0.1",8888))
print(data.decode("utf-8")

三.UDP聊天

  与TCP代码的区别

  不需要监听 不需要接收

  type参数为 SOCK_DGRAM

  UDP 可以同时处理多个客户端 是因为CPU处理速度快 给人感觉像同时处理

  群聊

    1.客户端先把数据交给服务器

    2.服务器先存储对方的地址

    3.把收到的数据给所有人都发一遍

#服务器

import socket
server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
server.bind(("127.0.0.1",8848)) #如果客户端与服务器同一台计算机 并且有多个客户端 这些客户端ip都是相同127.0.0.1
clients = {}
while True:
msg,addr = server.recvfrom(1024)
# 存储对方的地址:
clients[addr[1]] = addr
print(msg.decode("utf-8"))
#循环发给所有人
for c in clients:
server.sendto(msg,clients[c]) #客户端1
import socket
c = coket.c=soket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
msg= input(">>>:")
c.sendto(msg.encode("utf-8"),("127.0.0.1",8848))
msg,addr = c.recvfrom(1024)
print(msg.decode("utf-8"))
#客户端2
import socket
c = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
msg = input(">>>:"
c.sendto(msg.encode("utf-8"),("127.0.0.1",8848))
msg,addr = c.recvfrom(1024)
print(msg.decode("utf-8"))

UDP聊天2

#服务器
import socket
server = socket.socket(socket.AF_INET,sccket.SOCK_DGRAM)
server.bind(("127.0.0.1",8848))
clients={}
while True:
msg,addr = server.recvfrom(1024)
clients[addr[1]] = addr print(msg.decode("utf-8"))
for c in clients:
server.sendto(msg,clients[c]) #发送机
import socket
c = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
msg = input(">>>:")
c.sendto(msg.encode("utf-8"),("127.0.0.1",8848) #接收机
import socket
c = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#先随便发一条消息给服务器 让服务指导自己的地址
c.sendto("register".encode("utf-8"),("127.0.0.1",8848))
while True:
msg,addr = c.recvfrom(1024)
print(msg.decode("utf-8"))

6.UDP会粘包么?

#服务器

import socket
server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
server.bind(("127.0.0.1",8888))
while True:
msg,c_addr = server.recvfrom(512) print("收到自己%: 说:%s"%(c_addr[0],msg.decode("utf-8")))
server.sendto(msg.upper(),c_addr) #客户端
import socket
client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
client.sendto("".encode("utf-8"),("127.0.0.1"8888))
client.sendto("".encode("utf-8"),("127.0.0.1"8888))
client.sendto("".encode("utf-8"),("127.0.0.1"8888))
client.sendto("".encode("utf-8"),("127.0.0.1"8888))

结论:

  1.UDP 不粘包

  2.缓冲区大小要足够装数据包大小 建议不要超过512

UDP的使用场景: 视频电话 语音电话  直播

DNS   域名解析服务器

做一个时间服务器 使用UDP协议  客户端请求服务器获取当前时间

#服务端
import socket
import time
# 创建socket对象 指定type参数为socket.SOCK_DGRAM 表示使用UDP协议
server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # datagram数据报的意思
# 绑定ip和端口
server.bind(("127.0.0.1",8889)) while True:
# 接收数据 返回一个元祖 数据和 发送方的地址
msg,c_addr = server.recvfrom(1024)
msg=time.strftime("%Y-%m-%d %X").encode("utf-8")
print("%s 收到来自%s: 说:%s" % (time.strftime("%Y-%m-%d %X"),c_addr[0] ,msg.decode("utf-8")))
print(type(msg))
# 发送数据到指定ip和端口
server.sendto(msg.upper(),c_addr) #用户端
import socket client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # datagram数据报的意思 while True:
msg = input(">>>:")
client.sendto(msg.encode("utf-8"),("127.0.0.1",8889))
data,addr = client.recvfrom(1024)
print(data.decode("utf-8"))

第三十四天 UDP协议 并发编程的更多相关文章

  1. JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫

    JAVA之旅(三十四)--自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫 我们接着来说网络编程,TCP 一.自定义服务端 我们直接写一个服务端,让本机去连接 ...

  2. COJ966 WZJ的数据结构(负三十四)

    WZJ的数据结构(负三十四) 难度级别:C: 运行时间限制:20000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给一棵n个节点的树,请对于形如"u  ...

  3. NeHe OpenGL教程 第三十四课:地形

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  4. Java进阶(三十四)Integer与int的种种比较你知道多少?

    Java进阶(三十四)Integer与int的种种比较你知道多少? 前言 如果面试官问Integer与int的区别:估计大多数人只会说到两点:Ingeter是int的包装类,注意是一个类:int的初值 ...

  5. Gradle 1.12用户指南翻译——第三十四章. JaCoCo 插件

    本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  6. SQL注入之Sqli-labs系列第三十四关(基于宽字符逃逸POST注入)和三十五关

    开始挑战第三十四关和第三十五关(Bypass add addslashes) 0x1查看源码 本关是post型的注入漏洞,同样的也是将post过来的内容进行了 ' \ 的处理. if(isset($_ ...

  7. spring boot 常见三十四问

    Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家. 问题一 Spring Boot.Spring MVC 和 Spring 有什么区别 ...

  8. “全栈2019”Java多线程第三十四章:超时自动唤醒被等待的线程

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  9. 第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息

    第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多 ...

随机推荐

  1. 单点登录SSO:图示和讲解

    目录 概述 示例运行效果动画 跨域Web SSO时序图 代码截图 几个基本概念 涉及的站点和页面 重点理解:单点登录的核心步骤 敢说最准确的单点登录图示,因为: 我严格对照所画时序图的每个步骤,开发了 ...

  2. .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中

    不知你是否见过 try { } finally { } 代码中,try 块留空,而只往 finally 中写代码的情况呢?这种写法有其特殊的目的. 本文就来说说这种不一样的写法. 你可以点开这个链接查 ...

  3. 教你使用HTML5原生对话框元素,轻松创建模态框组件

    HTML 5.2草案加入了新的dialog元素.但是是一种实验技术. 以前,如果我们想要构建任何形式的模式对话框或对话框,我们需要有一个背景,一个关闭按钮,将事件绑定在对话框中的方式安排我们的标记,找 ...

  4. 52abp框架asp.net core & Angular快速开发实战视频教程

    课程标题 52abp框架asp.net core & Angular全栈开发实战视频课程 课程简介 从零开始学 52ABP企业开发框架,企业项目是如何开发和技术选型,代码如何管理,团队协同开发 ...

  5. R语言线性回归

    回归分析是一个广泛使用的统计工具,用于建立两个变量之间的关系模型. 这些变量之一称为预测变量,其值通过实验收集. 另一个变量称为响应变量,其值来自预测变量. 在线性回归中,这两个变量通过一个等式相关联 ...

  6. bug总结

    1.被除数为0 2.Java 空指针异常(java.lang.NullPointerException) 即对象没有进行实例化便进行了使用.实例化的意义,就是将对象实例的地址赋值给对象符号. 比如 S ...

  7. 书城项目第五阶段---book表的curd

    JavaEE三层架构分析 MVC

  8. mysql常用命令行操作(二):表和库的操作、引擎、聚合函数

    一.查看.创建.删除数据库 create database library default character set utf8 collate utf8_general_ci; # 创建数据库并设置 ...

  9. Latex常用软件

    Linux texMaker sudo apt-get install texlive-full sudo apt-get install texmaker

  10. Numpy中array数据操作

    1.创建: import numpy as np arr=np.array([1,2,3]) print(arr,arr.ndim) list=[1,2,3] arr=np.array(list) 2 ...