原文地址: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
© 版权声明
本站所有资源来自于网络,仅供学习与参考,请勿用于商业用途,否则产生的一切后果将由您(转载者)自己承担!
如有侵犯您的版权,请及时联系3500663466#qq.com(#换@),我们将第一时间删除本站数据。
如有侵犯您的版权,请及时联系3500663466#qq.com(#换@),我们将第一时间删除本站数据。
THE END
暂无评论内容