我一直在尝试用C#编写一个基本的客户端 - 服务器设置,主要由these教程编写,为了一些额外的功能而改变代码。我引入的主要区别是控制代码:服务器解释的字符串,用于更改响应的行为。这些都很好,都在工作。
我可以让服务器响应 - 一次。这就是问题所在:客户端连接,被服务器识别并可以发送消息,但第二条消息似乎根本没有通过 - 服务器没有注意到它,客户端冻结。 / p>
服务器:
while (true)
{
Output.Log("Waiting for a connection...", LogType.Info);
// Program is suspended while waiting for an incoming connection.
Socket handler = listener.Accept();
data = null;
// Options
bool echo = false;
bool display = true;
// An incoming connection needs to be processed.
while (true)
{
bytes = new byte[1024];
int bytesRec = handler.Receive(bytes);
string message = Encoding.ASCII.GetString(bytes, 0, bytesRec);
data += message;
List<string> controlCodes = GetControlCodes(message);
if (controlCodes.Contains("Echo-Back"))
{
echo = true;
}
if (controlCodes.Contains("No-Display"))
{
display = false;
}
if (data.IndexOf("<End>") > -1)
{
break;
}
}
// Show the data on the console.
if (display)
{
Output.Log("Data received: " + data, LogType.Info);
}
else
{
Output.Log("Data received, No-Display set", LogType.Info);
}
// Echo the data back to the client.
byte[] msg;
if (echo)
{
msg = Encoding.ASCII.GetBytes(data);
}
else
{
msg = Encoding.ASCII.GetBytes("<Received;No-Echo>");
}
Output.Log("Response sent: " + Encoding.ASCII.GetString(msg), LogType.Info);
handler.Send(msg);
}
客户:
sender.Connect(remoteEP);
Console.WriteLine("Socket connected to {0}",
sender.RemoteEndPoint.ToString());
while (true)
{
Console.Write("> ");
string userMessage = Console.ReadLine();
Send(sender, userMessage + "<End>");
}
// ...
public static void Send(Socket sender, string message)
{
byte[] bytes = new byte[1024];
byte[] msg = Encoding.ASCII.GetBytes(message);
int bytesSent = sender.Send(msg);
int bytesRec = sender.Receive(bytes);
Console.WriteLine("Response: {0}",
Encoding.ASCII.GetString(bytes, 0, bytesRec));
}
据我所知,套接字很好,因为我可以获得第一条消息的连接。
在冻结发生时破坏程序时,服务器在listener.Accept()
呼叫上冻结,而客户端在sender.Receive()
上冻结。这种情况让我觉得这是因为我还没有关闭以前的联系;我该怎么做?从本质上讲,我如何修复它以便它们不会同时等待?