C#实现SSE(Server-Sent Events)服务端和客户端

服务端不停发送当前时间。

服务端代码: 

using System;
using System.Collections.Generic;
using System.Net;
using System.Text;
using System.Threading;

namespace SSEserver
{
    class Program
    {
        static void Main(string[] args)
        {
            HttpListener listener = new HttpListener();
            listener.Prefixes.Add("http://localhost:8080/");
            listener.Start();

            Console.WriteLine("Server is running...");

            while (true)
            {
                HttpListenerContext context = listener.GetContext();
                ThreadPool.QueueUserWorkItem((_) =>
                {
                    SendEvent(context);
                });
            }
        }

        static void SendEvent(HttpListenerContext context)
        {
            try
            {
                context.Response.ContentType = "text/event-stream";
                context.Response.StatusCode = 200;
                context.Response.Headers.Add("Cache-Control", "no-cache");
                context.Response.Headers.Add("Connection", "keep-alive");

                while (true)
                {
                    string message = $"data: {DateTime.Now.ToString("HH:mm:ss")}\n\n";
                    byte[] bytes = Encoding.UTF8.GetBytes(message);
                    context.Response.OutputStream.Write(bytes, 0, bytes.Length);
                    context.Response.OutputStream.Flush();
                    Thread.Sleep(1000); // 每秒发送一次消息
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: " + ex.Message);
            }
            finally
            {
                context.Response.Close();
            }
        }
    }
}

客户端不停接收服务端发送的时间。

客户端代码: 

using System;
using System.IO;
using System.Net;
using System.Text;
namespace SSEclient
{
    class Program
    {
        static async Task Main(string[] args)
        {
            string url = "http://localhost:8080/sse_endpoint"; // SSE endpoint URL

            using (HttpClient client = new HttpClient())
            {
                var request = new HttpRequestMessage(HttpMethod.Get, url);
                request.Headers.Add("Accept", "text/event-stream");

                using (HttpResponseMessage response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead))
                {
                    response.EnsureSuccessStatusCode();

                    using (var responseStream = await response.Content.ReadAsStreamAsync())
                    using (var reader = new System.IO.StreamReader(responseStream))
                    {
                        while (!reader.EndOfStream)
                        {
                            string line = await reader.ReadLineAsync();

                            if (!string.IsNullOrWhiteSpace(line))
                            {
                                Console.WriteLine(line);
                                // Handle the received SSE event here
                            }
                        }
                    }
                }
            }
        }
    }
}

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用C#编写的简单的服务客户程序,用于客户服务发送消息,服务接收消息并回复消息。 服务代码: ```csharp using System; using System.Net; using System.Net.Sockets; using System.Text; class Program { static void Main(string[] args) { TcpListener server = null; try { // 设置IP地址和口号 IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); int port = 8888; // 创建TcpListener对象 server = new TcpListener(ipAddress, port); // 开始监听 server.Start(); Console.WriteLine("服务已启动,等待客户连接..."); // 接收客户连接 TcpClient client = server.AcceptTcpClient(); Console.WriteLine("客户已连接"); // 获取网络流 NetworkStream stream = client.GetStream(); // 接收消息并回复消息 byte[] buffer = new byte[1024]; int byteCount; while ((byteCount = stream.Read(buffer, 0, buffer.Length)) != 0) { string message = Encoding.UTF8.GetString(buffer, 0, byteCount); Console.WriteLine("收到消息:" + message); // 回复消息 byte[] reply = Encoding.UTF8.GetBytes("已收到消息:" + message); stream.Write(reply, 0, reply.Length); } } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { // 关闭TcpListener对象 if (server != null) { server.Stop(); } } Console.ReadKey(); } } ``` 客户代码: ```csharp using System; using System.Net; using System.Net.Sockets; using System.Text; class Program { static void Main(string[] args) { TcpClient client = null; try { // 设置IP地址和口号 IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); int port = 8888; // 创建TcpClient对象 client = new TcpClient(); // 连接服务 client.Connect(ipAddress, port); Console.WriteLine("连接到服务"); // 获取网络流 NetworkStream stream = client.GetStream(); // 发送消息 string message = "Hello, server!"; byte[] buffer = Encoding.UTF8.GetBytes(message); stream.Write(buffer, 0, buffer.Length); Console.WriteLine("发送消息:" + message); // 接收回复消息 buffer = new byte[1024]; int byteCount = stream.Read(buffer, 0, buffer.Length); string reply = Encoding.UTF8.GetString(buffer, 0, byteCount); Console.WriteLine("收到回复消息:" + reply); } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { // 关闭TcpClient对象 if (client != null) { client.Close(); } } Console.ReadKey(); } } ``` 注意:在使用这个示例程序时,需要先启动服务,再启动客户服务等待客户连接,客户连接到服务后发送消息,服务接收消息并回复消息,客户接收回复消息并输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值