对于想了解为什么说“HTTP是无状态协议”?的读者,本文将提供新的信息,我们将详细介绍如何理解http协议的无状态特性,并且为您提供关于c#–操作是无状态的但控制器是无状态的?、HTTPoverQUI
对于想了解为什么说“HTTP 是无状态协议”?的读者,本文将提供新的信息,我们将详细介绍如何理解http协议的无状态特性,并且为您提供关于c# – 操作是无状态的但控制器是无状态的?、HTTP over QUIC重命名为“HTTP / 3”协议、HTTP 协议演进:为什么说 HTTP/1.1 的时代已经过去了、http 协议,web应用中的有状态和无状态的有价值信息。
本文目录一览:- 为什么说“HTTP 是无状态协议”?(如何理解http协议的无状态特性)
- c# – 操作是无状态的但控制器是无状态的?
- HTTP over QUIC重命名为“HTTP / 3”协议
- HTTP 协议演进:为什么说 HTTP/1.1 的时代已经过去了
- http 协议,web应用中的有状态和无状态
为什么说“HTTP 是无状态协议”?(如何理解http协议的无状态特性)
HTTP 有 HTTP Cookie。Cookies 允许服务器跟踪用户状态、连接数、上次连接等。
HTTP 具有持久连接 (Keep-Alive),其中可以从同一个 TCP 连接发送多个请求。
c# – 操作是无状态的但控制器是无状态的?
那么,每次调用任何动作时都会创建一个新的控制器实例吗?
解决方法
public class HomeController : Controller { public ActionResult Index() { return MoreIndex(); } public ActionResult MoreIndex() { return View(); } }
进入/ Home / Index的请求将输入两个操作,但只创建一个控制器.进入/ Home / MoreIndex的请求将进入一个操作,并创建一个控制器.现在没有什么可以阻止您手动创建控制器并使其保持活动状态并重新使用它.但它永远不会出现在来自HTTP的实际请求的上下文中.
HTTP over QUIC重命名为“HTTP / 3”协议
HTTP工作组暨QUIC工作组主席Mark Nottingham 建议将HTTP-over-QUIC(HTTP/QUIC)重命名为“HTTP/3”,以解决种种混淆。并在上周举行的IETF 103的QUIC工作组会议中提议通过。这标志着新HTTP版本将使用QUIC进行传输。
文 / Daniel Stenberg
译 / 元宝
原文 https://daniel.haxx.se/blog/2018/11/11/http-3/
在之前很长一段时间被称为HTTP-over-QUIC的协议现在已经正式改为了HTTP / 3。这是由马克诺丁汉最初的建议带来的。
IETF中的QUIC工作组致力于创建QUIC传输协议。QUIC是通过使用UDP来替代TCP。最初,QUIC是由谷歌发起的,然后更多的是用“HTTP/2-encrypted-over-UDP”协议。
当IETF标准化协议的工作启动时,它分为两层:传输和HTTP部分。这种传输协议也可以用于传输其他数据,而不仅仅是显式地用于HTTP或类似HTTP的协议。但它的名字仍然是QUIC。
社区中的人们引用这些不同版本的协议,使用非正式的名称,如iQUIC和gQUIC,将QUIC协议从IETF和谷歌中分离出来(因为它们在细节上有很大的不同)。长期以来,通过“iQUIC”发送HTTP的协议被称为“hq”(HTTP-over- quic)。
当Mike Bishop在IETF 103的QUIC工作组会议上展示这张几乎可以看成一个logo的幻灯片的时,整个房间的人都被他吓到了...
2018年11月7日,Litespeed的Dmitri 宣布,他们和Facebook已成功完成了两次HTTP / 3实现之间的第一次互操作。可以在此处看到 Mike Bihop 关于该主题的HTTPbis会话的后续演示。该会议结束后达成的共识是新的名称为HTTP / 3!
无须有更多的困惑,HTTP / 3是即将推出的使用QUIC进行传输的新HTTP版本!
精品文章推荐
技术趋势:
UDP成为低延时流媒体关键 选SRT还是QUIC?
BBR如何让Spotify流媒体更流畅?
CMAF将在2019年得到快速发展
YouTube高效传输策略:节省14%带宽 用户体验提升
人物专访:
Akamai首席架构师Will:WebRTC、QUIC、DASH、AV1都前景可观
马思伟:视频领域是个海洋,可以游泳、冲浪、潜水和远航
技术干货:
下一代低延时直播CDN:HLS、RTMP 与UDP +WebRTC
WebRTC的拥塞控制和带宽策略
本文分享自微信公众号 - LiveVideoStack(livevideostack)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
HTTP 协议演进:为什么说 HTTP/1.1 的时代已经过去了

前言
Java Stream 是一种强大的数据处理工具,可以帮助开发人员快速高效地处理和转换数据流。使用 Stream 操作可以大大简化代码,使其更具可读性和可维护性,从而提高开发效率。本文将为您介绍 Java Stream 操作的所有方面,包括 groupingBy、groupingBy、joining、mapping 等操作,让你的代码行云流水,更加优雅。
- groupingBy ():按照指定条件对 Stream 中的元素进行分组。
- partitioningBy ():按照指定条件对 Stream 中的元素进行分区。
- joining ():将 Stream 中的元素连接成一个字符串。
- mapping ():根据指定的 Function 对 Stream 中的元素进行映射,并返回一个新的 Stream。
- flatMapping ():将每个元素映射为一个 Stream,然后将这些 Stream 连接成一个 Stream。
- iterating ():使用指定的种子值创建一个 Stream,并依次对每个元素进行指定的操作。
- empty ():返回一个空的 Stream。
- of ():根据指定的元素创建一个 Stream。
- concat ():将多个 Stream 连接成一个 Stream。
- unordered ():返回一个无序的 Stream。
示例
1. 使用 groupingBy () 按照字符串长度对字符串列表进行分组
代码示例:
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class GroupingByExample {
public static void main(String[] args) {
List<String> stringList = Arrays.asList("hello", "world", "java", "stream");
Map<Integer, List<String>> result = stringList.stream()
.collect(Collectors.groupingBy(String::length));
System.out.println(result);
}
}
输出结果:
{5=[hello, world], 4=[java], 6=[stream]}
2. 使用 partitioningBy () 将数字列表按照是否为偶数进行分区
代码示例:
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class PartitioningByExample {
public static void main(String[] args) {
List<Integer> numberList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Map<Boolean, List<Integer>> result = numberList.stream()
.collect(Collectors.partitioningBy(n -> n % 2 == 0));
System.out.println(result);
}
}
输出结果:
{false=[1, 3, 5, 7, 9], true=[2, 4, 6, 8, 10]}
3. 使用 joining () 将字符串列表中的元素用逗号连接成一个字符串
代码示例:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class JoiningByExample {
public static void main(String[] args) {
List<String> stringList = Arrays.asList("hello", "world", "java", "stream");
String result = stringList.stream()
.collect(Collectors.joining(","));
System.out.println(result);
}
}
输出结果:
hello,world,java,stream
4. 使用 mapping () 将字符串列表中的元素转换为大写字母
代码示例:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class MappingByExample {
public static void main(String[] args) {
List<String> stringList = Arrays.asList("hello", "world", "java", "stream");
List<String> result = stringList.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(result);
}
}
输出结果:
[HELLO, WORLD, JAVA, STREAM]
5. 使用 flatMapping () 将嵌套的字符串列表展平为一个字符串列表
代码示例:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class FlatMappingByExample {
public static void main(String[] args) {
List<List<String>> nestedList = Arrays.asList(
Arrays.asList("hello", "world"),
Arrays.asList("hello","java", "stream"));
List<String> result = nestedList.stream()
.flatMap(List::stream)
.distinct()
.collect(Collectors.toList());
System.out.println(result);
}
}
输出结果:
[hello, world, java, stream]
6. 使用 iterating () 生成斐波那契数列前 10 项
代码示例:
import java.util.stream.Stream;
public class IteratingByExample {
public static void main(String[] args) {
Stream.iterate(new int[]{0, 1}, t -> new int[]{t[1], t[0] + t[1]})
.limit(10)
.map(t -> t[0])
.forEach(System.out::println);
}
}
输出结果:
0
1
1
2
3
5
8
13
21
34
7. 使用 empty () 使用空的 Stream
代码示例:
import java.util.stream.Stream;
public class EmptyStreamExample {
public static void main(String[] args) {
Stream<String> emptyStream = Stream.empty();
System.out.println(emptyStream.count());
}
}
输出结果:
0
8. 使用 of () 创建包含一些字符串的 Stream
代码示例:
import java.util.stream.Stream;
public class OfStreamExample {
public static void main(String[] args) {
Stream<String> stringStream = Stream.of("hello", "world", "java", "stream");
stringStream.forEach(System.out::println);
}
}
输出结果:
hello
world
java
stream
9. 使用 concat () 将两个字符串列表合并为一个列表
代码示例:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class ConcatStreamExample {
public static void main(String[] args) {
List<String> list1 = Arrays.asList("hello", "world");
List<String> list2 = Arrays.asList("java", "stream");
Stream<String> stream1 = list1.stream();
Stream<String> stream2 = list2.stream();
List<String> result = Stream.concat(stream1, stream2)
.collect(Collectors.toList());
System.out.println(result);
}
}
输出结果:
[hello, world, java, stream]
10. 使用 unordered () 对数字列表进行排序后,使用 unordered () 返回一个无序的 Stream
代码示例:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class UnorderedStreamExample {
public static void main(String[] args) {
List<Integer> numberList = Arrays.asList(1, 3, 2, 4, 10, 6, 8, 7, 9, 6);
List<Integer> result = numberList.stream()
.sorted()
.unordered()
.collect(Collectors.toList());
System.out.println(result);
}
}
输出结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
来个小坑
感谢大佬看到这里,如果你看完觉得没问题,那么你需要反思一下了哦。好了我们可以在仔细地看看,示例 10.unordered () 的代码。
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class UnorderedStreamExample {
public static void main(String[] args) {
List<Integer> numberList = Arrays.asList(1, 3, 2, 4, 10, 6, 8, 7, 9, 6);
List<Integer> result = numberList.stream()
.sorted()
.unordered()
.collect(Collectors.toList());
System.out.println(result);
}
}
输出结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
执行过程分析,首先输入了一个无序的流,然后使用 sorted () 对流进行排序,然后在使用 unordered (),去除流的有序约束。然后输出为 List,在进行打印出来。按理来说,输出的顺序应该是一个无需的,而不是有序的。
解答
unordered () 操作不会执行任何操作来显式地对流进行排序。它的作用是消除了流必须保持有序的约束,从而允许后续操作使用不必考虑排序的优化。
对于顺序流,顺序的存在与否不会影响性能,只影响确定性。如果流是顺序的,则在相同的源上重复执行相同的流管道将产生相同的结果;如果是非顺序流,重复执行可能会产生不同的结果。
unordered () 操作,是消除了流必须保持有序的约束。并不会改变,流原有的顺序。对于并行流,放宽排序约束有时可以实现更高效的执行。在流有序时,但用户不特别关心该顺序的情况下,使用 unordered () 明确地对流进行去除有序约束可以改善某些有状态或终端操作的并行性能。
参考
https://segmentfault.com/q/1010000017969473
结尾
如果觉得对你有帮助,可以多多评论,多多点赞哦,也可以到我的主页看看,说不定有你喜欢的文章,也可以随手点个关注哦,谢谢。
我是不一样的科技宅,每天进步一点点,体验不一样的生活。我们下期见!
http 协议,web应用中的有状态和无状态
1、什么是Web应用程序的无状态性?
说基于http协议的web应用程序是请求——应答模式是无状态的,我们可以这样理解:每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求是无直接关系的,它不会受前面的请求应答情况直接影响,也不会直接影响后面的请求应答情况。
2、如何使我们的web应用是有状态?
在http协议的基础上,web应用引入cookies, session,application来保持web应用之间的状态。
注:
cookies,session,application都不是标准协议,但是各种网络应用提供商,实现语言、web容器都默认支持它。当然这种支持与对网络标准协议的支持是不同的,标准协议规定的接口,而这种机制只是规定了思想。
其实从我们上面的分析看来,application不应该被视为这种意义上出现的维护状态的机制。它是决定怎么应用程序的“配制文件”。但是如果你从这种状态维持机制所覆盖的范围来推导,你会发现,application好像也算得上。
Session所控制的范围是一个session。一个会话,会话从第一次访问服务器开始存在,到服务器调用session.invalidator()(可能是超时,可能是其它原因)。
Cookies所控制的范围有它自己的定义(与session没有直接的关系),可以长可以短。只要服务器放在用户文件系统中的cookies没有被删除,至少服务器还识别它。它的控制范围就是还在的。
这个角度上讲,Session和Cookies都可以归为跨页面的状态。但是session跨不出一次会话,Cookies跨不出两端的限制。
Application,则是关联这个网络应用程序的。
举例:
有人将web应用中有无状态的情况,比着顾客逛商店的情景。
顾客:浏览器访问方;
商店:web服务器;
一次购买:一次http访问
我们知道,上一次顾客购买,并不代表顾客下一个小时一定会买(当然也不能代表不会)。也就是说同一个顾客的不同购买之间的关系是不定的。所以说实在的,这种情况下,让商店保存所有的顾客购买的信息,等到下一次购买可以知道这个顾客以前购买的内容代价非常大的。所以商店为了避免这个代价,索性就认为每次的购买都是一次独立的新的购买。浅台词:商店不区分对待老顾客和新过客。这就是无状态的。
但是,商店为了提高收益。她是想鼓励顾客购买的。所以告诉你,只要你在一个月内购买了5瓶以上的啤酒,就送你一个酒杯。
我们看看这种情况我们怎么去实现呢?
A,给顾客发放一个磁卡,里面放有顾客过去的购买信息。
这样商店就可以知道了。这就是cookie.
B,给顾客发放一个唯一号码,号码制定的顾客的消费信息,存储在商店的服务器中。这就是session。
最后,商店可以全局的决定,是5瓶为送酒杯还是6瓶。这就是application。
其实,这些机制都是在无状态的传统购买过程中加入了一点东西,使整个过程变得有状态。Web应用就是这样的。
今天的关于为什么说“HTTP 是无状态协议”?和如何理解http协议的无状态特性的分享已经结束,谢谢您的关注,如果想了解更多关于c# – 操作是无状态的但控制器是无状态的?、HTTP over QUIC重命名为“HTTP / 3”协议、HTTP 协议演进:为什么说 HTTP/1.1 的时代已经过去了、http 协议,web应用中的有状态和无状态的相关知识,请在本站进行查询。
本文标签: