原文地址: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 }
复制代码 结果
这里我们使用控制台简朴展示一下
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|