代码之家  ›  专栏  ›  技术社区  ›  Bercovici Adrian

未调用.NET核心中间件

  •  0
  • Bercovici Adrian  · 技术社区  · 6 年前

    你好,我有以下问题:

    我试图从 Console Application 给一个 ASP NET Core Server 通过 websockets 是的。

    Console 应用程序i序列化对象 NewtonSoft Json 我把它寄过去 Socket 到.NET核心服务器。

    在服务器上,我创建了一个小型中间件。 Invoke 方法不被调用。

    我将两个visual studio实例保持打开状态,服务器端不会发生任何事情,直到我关闭客户端的连接,服务器端-终端上弹出此错误:

    enter image description here

    1个 服务器

    1.1款 程序

        class Program
            {
                static void Main(string[] args)
                {
                    BuildWebHost(args).Run();
                }
                public static IWebHost BuildWebHost(string[] args)=>
    
                    WebHost.CreateDefaultBuilder(args)
                    .UseStartup<Startup>()
                    .UseKestrel()
                    .UseSockets()
                    .UseUrls("http://localhost:8200")
    
                    .Build();
            }
    

    1.2款 启动类

    public class Startup
        {
            public void ConfigureServices(IServiceCollection services)
            {
    
                services.AddSingleton<WebSocketService>(x=>new WebSocketService());
    
            }
            public void Configure(IApplicationBuilder builder)
            {
    
                builder.UseWebSockets();
                builder.UseMiddleware<SocketMiddleware>();
    
    
            }
        }
    

    1.3款 中间件

    class SocketMiddleware
        {
            WebSocketService handler;
            public SocketMiddleware(WebSocketService _handler,RequestDelegate del)
            {
                this.handler = _handler;
                this.next = del;
            }
    
            RequestDelegate next;
    
            public async Task Invoke(HttpContext context)
            {
    
    
                if (!context.WebSockets.IsWebSocketRequest)
                {
                    await  this.next(context);
                    return;
                }
                await this.handler.AddClientAsync(context.WebSockets);
    
            }
        }
    

    注意:我不会发布中间件使用的服务的代码,因为它与本例无关。 invoke 没有接到电话。

    2个 顾客

    客户端只是序列化一个poco类 Player 然后通过套接字发送,然后等待服务器以 玩家 是的。

    static async Task Main(string[] args)
            {
                Player updatePlayer = new Player(100);
                List<Player> players;
                Memory<byte> buffer = new byte[2000];
                ReadOnlyMemory<byte> toSend;
                ReadOnlyMemory<byte> actualReceived;
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8200);
                Random rand = new Random();
    
                await socket.ConnectAsync(iPEndPoint);
                using(NetworkStream stream =new NetworkStream(socket))
                {
                    while (true)
                    {
                        updatePlayer.Lat = rand.Next(10, 100);
                        updatePlayer.Lng = rand.Next(10, 100);
    
                        string data=JsonConvert.SerializeObject(updatePlayer);
                        toSend = Encoding.UTF8.GetBytes(data);
                        await stream.WriteAsync(toSend);
    
                        int received=await stream.ReadAsync(buffer);
                        actualReceived = buffer.Slice(0, received);
                        string msg = Encoding.UTF8.GetString(actualReceived.ToArray());
                        players = JsonConvert.DeserializeObject<List<Player>>(msg);
                        if (Console.ReadKey().Key == ConsoleKey.Escape)
                        {
                            break;
                        }
    
                    }
                }
    
    
            }
    

    附笔 可能是服务器使用的问题 WebSockets网站 在客户身上我用 socket 上课?我想只要目的地地址和端口是好的..它只是字节。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Bercovici Adrian    6 年前

    服务器.cs 这个 Invoke 方法 具有类型为的参数 WebSocketManager 是的。

    我们可以接受 WebSocket 连接但不是原始的 Socket 是的。
    因此在 客户机.cs 我把生的换了 插座 用一个 WebSocket网站 实施。