|
原文地址:https://www.cnblogs.com/ysmc/p/18780674
近年AI风靡全球,我们日常见到的最多的就是跟AI聊天,极大减少了我们的搜索时间,不过大家也要注意甄别AI回答的正确性,身体不舒服还是老老实实看医生。
AI聊天的输出是逐字输出的,有些小伙伴就很好奇这个是怎么实现的,比较简单的就是SSE,高级点的是WebSocket,本文我们先讲一下SSE。
SSE
Server-Sent Events,基于 HTTP 协议的推送技术,服务器可以向目标持续推送数据,与 WebSocket 不同,它是单向的。
秉承一向的惯例,直接上代码
服务端
这里读取一个本地文件,每100ms往客户端发送5个字符,需要注意的一点是,返回的 ContentType = "application/octet-stream",你需要告诉客户端返回的是一个流
1 [HttpGet("GetStream")]
2 public async Task GetStream()
3 {
4 string filePath = "文档.txt";
5 Response.ContentType = "application/octet-stream";
6 var reader = new StreamReader(filePath);
7 var buffer = new Memory<char>(new char[5]);
8 int writeLength;
9 //每次读取5个字符写入到流中
10 while ((writeLength = await reader.ReadBlockAsync(buffer)) > 0)
11 {
12 if (writeLength < buffer.Length)
13 {
14 buffer = buffer[..writeLength];
15 }
16 var value = buffer.ToString();
17 await Response.WriteAsync(value);
18 await Task.Delay(100);
19 }
20 }
读取的文档内容
客户端
1 [HttpGet("TestGetStream")]
2 public async Task TestGetStream([FromServices] IHttpClientFactory httpClientFactory)
3 {
4 using var client = httpClientFactory.CreateClient();
5 using var stream = await client.GetStreamAsync("http://localhost:5237/api/Test/GetStream");
6 using var streamReader = new StreamReader(stream);
7 var buffer = new char[5];
8 int writeLength;
9 while ((writeLength = await streamReader.ReadBlockAsync(buffer, 0, buffer.Length)) > 0)
10 {
11 Console.Write(new string(buffer, 0, writeLength));
12 }
13 Console.WriteLine("\nEND");
14 }
效果
这里我们使用控制台简单展示一下
本文来自博客园,作者:一事冇诚,转载请注明原文链接:https://www.cnblogs.com/ysmc/p/18780674
来源:https://www.cnblogs.com/ysmc/p/18780674 |