客户端的连接方法在读取服务器的响应后卡住了

问题描述

我有一个客户端和一个服务器应用程序。 服务器启动,启动后,它照常等待连接。 客户端通过我称为SocketMessage的自定义类发送请求,SocketMessage仅存储客户端的用户名一个字符串,其中包含客户端想要向服务器请求的方法。 服务器获取SocketMessage,将其反序列化,然后读取指示该方法的字符串,从中,它根据switch语句选择要执行的方法

我可以从客户端发送请求,在服务器上接收请求并发送响应,但是在客户端,当尝试读取响应时,客户端的Connect方法锁定在streamReader.ReadLine

这是SERVER,ClientCommunication在子进程上运行。

private void ClientCommunication(object cliente)
        {
            TcpClient tccliente = (TcpClient)cliente;
            StreamReader reader = new StreamReader(tccliente.GetStream());
            StreamWriter serverStreamWriter = new StreamWriter(tccliente.GetStream());

            while (serverOn)
            {

                try
                {
                    
                    var msj= reader.ReadLine();
                    SocketMessage<object> msjReceived= JsonConvert.DeserializeObject<SocketMessage<object>>(msj);
                    
                    
                        SelectMethod(msjReceived.Method,msj,ref serverStreamWriter);
                    
                }
                catch (Exception ex)
                {
                   
                    MessageBox.Show(ex.Message,"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
                    break;
                }
            }

            tccliente.Close();
        }

public void SelectMethod(string pMethod,string pMsj,ref StreamWriter serverStreamWriter)
        {
            switch (pMethod)
            {
                case "CONNECT":
               
                    SocketMessage<string> connectMsj = JsonConvert.DeserializeObject<SocketMessage<string>>(pMsj);  
                        LogConnection(connectMsj.Entidad);
                        serverStreamWriter.Write("CONNECTED");
                        serverStreamWriter.Flush();
                    break;
                default:
                    break;
            }
        }

这是Client的自定义类,用于处理请求的发送。

public string RequestConnection(string pUsername)
        {
            try
            {
                
                ipServer = IPAddress.Parse("127.0.0.1");
                client = new TcpClient();
                serverEndPoint = new IPEndPoint(ipServer,16830);
               
                client.Connect(serverEndPoint);
                string serverRsp;

                SocketMessage<string> connectionRequest= new MensajeSocket<string> { Method= "CONNECT",Entity = pUsername};
                
                clientStreamReader = new StreamReader(cliente.GetStream());
                clientStreamWriter = new StreamWriter(cliente.GetStream());
                
                clientStreamWriter.WriteLine(JsonConvert.SerializeObject(connectionRequest));
                clientStreamWriter.Flush();
                Console.WriteLine("request SENT");
                //THIS is where it gets stuck
                serverRsp = clientStreamReader.ReadLine();
                Console.WriteLine("streamReader READ " + serverRsp);
                
                return serverRsp;
            }
            catch (SocketException ex)
            {
                Console.WriteLine(ex.Message);
                return ex.Message;
            }    
        }

为什么打serverRsp = clientStreamReader.ReadLine();时卡住了?我知道ReadLine会被锁定,直到收到响应为止,但是我正在从服务器发送响应。我已经确认服务器确实收到了请求并正确记录了该请求,但是似乎客户端无法读取相关的“ CONNECTED”消息,知道发生了什么事吗?

解决方法

11 GB等待有效负载中的换行终止。当您的客户端仅发送ReadLine()时,Write()会将换行符附加到有效负载的末尾,因此服务器/侦听器知道何时停止侦听数据。

WriteLine()