我一直在尝试用C#编写基本的客户端-服务器设置,主要是由这些教程进行,为一些额外的功能稍微修改了代码。 我介绍的主要区别是控制代码:服务器解释字符串以更改响应的行为。 很好,都正常。

我可以让服务器响应-一次。 这就是问题所在:客户端连接,服务器识别并可以发送消息,但是第二条消息似乎根本无法通过-服务器没有注意到它,客户端冻结了。

服务器:

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() 这种感觉让我认为是因为我没有关闭先前的连接; 我如何以及在哪里做? 从本质上讲,我该如何解决这个问题,使两者不会同时等待?

  ask by ArtOfCode translate from so

本文未有回复,本站智能推荐:

1回复

服务器响应最佳实践[关闭]

关闭。 这个问题是基于意见的。 它目前不接受答案。 想改善这个问题吗? 更新问题,以便通过编辑这篇文章用事
1回复

当我从客户端向服务器发送命令时,仅当请求发送两次时,客户端才会收到响应

我正在尝试向服务器发送命令,例如请求服务器将其目录中的文件列表发回。 问题是,当我向服务器发送“列表”命令时,我必须发送两次,以便服务器将文件列表发送回客户端。 我确定服务器两次都会收到命令,因为在服务器端我会打印应该发送到控制台上的客户端的结果,并且两次都出现。 我正在使用C#和TCP
1回复

C#异步套接字客户端/服务器在服务器响应上挂起

我一直在玩我在MSDN中找到的一些c#套接字代码(原始服务器代码和客户端代码 ),遇到了一个我不理解的问题。 首先,这是我的套接字服务器代码: 现在为客户代码: 如果我注释掉客户端中从服务器接收回响应的代码以及尝试将响应发送到客户端的服务器中的代码,那么事情似乎正在按您期望的方式工作(
1回复

ASPNetWebAPI2响应缓存(服务器端)

是否可以在服务器端缓存一次产生的响应,然后响应相同的请求重新传递它? 让我解释一下:我有一个需要大约5秒钟才能生成响应的最终要求-这包括进入数据库并获取数据,对其进行处理,对其进行一些计算,确定和压缩响应-整个过程需要5秒钟。 第一次完成此操作后,我希望结果可用于来自所有用户的所有请求。
1回复

第二次通信的异步客户端/服务器c#问题

我正在努力解决问题,在第一次成功与套接字完全连接后,我可以无错误地建立第二个。 该怎么办 ? 我已经提供了两个应用程序,因此您可以尝试帮助我解决该问题。 非常感谢你们! 服务器控制台应用程序应该关注 cca 10 客户端,因此每个人的线程都不是解决方案 从控制台登录:Press any key to
2回复

服务器响应在随机性上有所不同,这使Json.Parse失败

我遇到了一个很奇怪的问题,使我发疯。 开始,我注意到我的Json.Parse有时会失败。 看起来像这样 我得到的两个不同的回应是 它无法将其解析为Json对象。 我不知道为什么有时决定删除\\并且在整个数组周围也没有“” 这可以正常工作,并且JSON.parse将其转换为Jso
1回复

(Socket.SendTo)如何响应/将数据发送回服务器开始接收的客户端?C#

我正在使用UDP服务器,可以很好地接收数据,但是我不知道如何存储端点以将数据发送回去。 在SetupServer()的最后一行中的SetupServer()中,我不知道如何获取EndPoint 。 这是我的服务器代码:
2回复

C#TCP服务器等待2个客户端响应

我目前正在处理服务器/客户端项目。 我的问题是,服务器如何等待两个特定的连接响应? 服务器: 每个连接都放入队列,并且如果queue.count> = 2(计时器每20秒检查一次),则应该启动一个新线程,该线程等待两个客户端的响应都以10秒超时。 我尝试了3天,但找不到一种好的