我有一个客户端和一个服务器应用程序。 服务器启动,启动后,它照常等待连接。 客户端通过我称为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”消息,知道发生了什么事吗?
答案 0 :(得分:0)
11 GB
等待有效负载中的换行终止。当您的客户端仅发送ReadLine()
时,Write()
会将换行符附加到有效负载的末尾,因此服务器/侦听器知道何时停止侦听数据。
WriteLine()