StreamReader似乎在ReadLine之后前进,即使没有什么要阅读的

问题描述

我有一个客户端/服务器应用程序。 在我的客户端应用程序上,有一个循环来处理客户端通信。有一个带有ReadLine命令的StreamReader。 应该命令保持锁定状态,直到收到要读取的内容为止。但是,以我为例,在发送1个请求后,即使没有消息发送,在下一个周期,到达ReadLine之后程序仍将前进。 这在下一行引发了一个异常,在该行中,我试图使我在上一行中接收到的消息反现实,因为它试图对null

private void ClientCommunication(object client)
        {
            TcpClient tcClient = (TcpClient)client;
            StreamReader reader = new StreamReader(tcCliente.GetStream());
            StreamWriter serverStreamWriter = new StreamWriter(tcClient.GetStream());

            while (serverIsOn)
            {

                try
                {
                    //This line should be blocked until there's actually something to read.
                     
                    var message= reader.ReadLine();
                    //But after handling one request,it moves to this line on its own even if there's no message yet
                    SocketMessage<object> requestReceived= JsonConvert.DeserializeObject<SocketMessage<object>>(message);//And this is where the exception gets thrown from,because message is eventually null.
                    if (!connectedClientsDict.ContainsKey(requestReceived.Entity.ToString())){
                        connectedClientsDict.Add(requestReceived.Entity.ToString(),tcClient);
                        SelectMethod(requestReceived.Method,message,ref serverStreamWriter);
                    } else
                    {
                        SelectMethod(requestReceived.Metodo,ref serverStreamWriter);
                    }
                }
                catch (Exception ex)
                {
                    
                    MessageBox.Show(ex.Message,"Error in ClientCommunication",MessageBoxButtons.OK,MessageBoxIcon.Error);
                    break;
                }
            }
tcClient.Close();
}

这是SelectMethod方法

public void SelectMethod(string pMethod,string pMessage,ref StreamWriter serverStreamWriter)
        {
            switch (pMethod)
            {
             case "RegisterEmployee":
                
                try {
                    semaphore = new Semaphore(1,1);
                    semaphore.WaitOne();
                    SocketMessage<Employee> employeeToRegister = JsonConvert.DeserializeObject<SocketMessage<Employee>>(pMessage);
                    data.RegisterEmployee(employeeToRegister.Entity);
                    SocketMessage<string> serverRsp = new SocketMessage<string> { Entity= "SERVER",Method= "SUCCESS" };
                    serverStreamWriter.WriteLine(JsonConvert.SerializeObject(serverRsp));
                    serverStreamWriter.Flush();
                    semaphore.Release();
                    break;
                } catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    SocketMessage<string> serverRsp= new SocketMessage<string> { Entity = ex.Message.ToString(),Method = "EMPLOYEE ALREADY EXISTS" };
                    serverStreamWriter.WriteLine(JsonConvert.SerializeObject(serverRsp));
                    serverStreamWriter.Flush();
                    semaphore.Release();
                    break;
                }

            default:
                break;
        }
    }

如果有帮助,这是从客户端发送的方法。

public SocketMessage<string> RequestEmployeeRegistration(Employee emp)
        {
            try
            {
                serverIp = IPAddress.Parse("127.0.0.1");
                client = new TcpClient();
                serverEndPoint = new IPEndPoint(serverIp,16830);
                SocketMessage<string> serverRsp;
                string serializedRsp;
                client.Connect(serverEndPoint);
                SocketMessage<Emp> empToRegister = new SocketMessage<Employee> { Method = "RegisterEmployee",Entidad = emp };
                clientStreamReader = new StreamReader(client.GetStream());
                clientStreamWriter = new StreamWriter(client.GetStream());
                clientStreamWriter.WriteLine(JsonConvert.SerializeObject(empToRegister ));
                clientStreamWriter.Flush();
                serializedRsp = clientStreamReader.ReadLine();
                serverRsp = (JsonConvert.DeserializeObject<SocketMessage<string>>(serializedRsp));
                client.Close();
                return serverRsp;

            } catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                client.Close();
                return new SocketMessage<string> { Entity = "ERROR",Method = ex.Message };
                
            }
        }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...