问题描述
我有一个客户端/服务器应用程序。
在我的客户端应用程序上,有一个循环来处理客户端通信。有一个带有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 (将#修改为@)