为什么我的服务器只响应一次?

时间:2015-03-31 11:33:09

标签: c# server

我一直在尝试用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()上冻结。这种情况让我觉得这是因为我还没有关闭以前的联系;我该怎么做?从本质上讲,我如何修复它以便它们不会同时等待?

0 个答案:

没有答案