C# 网络客户端卡住了?

C# 网络客户端卡住了?,c#,webclient,C#,Webclient,背景 我正在构建一个远程c#应用程序,通过php服务器进行连接。它检查客户端程序是否被服务器识别,然后循环发送诸如time online之类的日志,并检查命令。我模糊地评论了一些部分,你可能不明白我为什么要这样做 namespace Revamped_SERVER { class Program { static readonly String BASEURL = "http://mysite.com/index.php?";

背景
我正在构建一个远程c#应用程序,通过php服务器进行连接。它检查客户端程序是否被服务器识别,然后循环发送诸如time online之类的日志,并检查命令。我模糊地评论了一些部分,你可能不明白我为什么要这样做

namespace Revamped_SERVER
    {
        class Program
        {
            static readonly String BASEURL = "http://mysite.com/index.php?";
            static String OLD_ID = default(String);
            static String CURRENT_ID = default(String);
            static string GET(string PHP,Boolean IS_COMMAND)
            {
                using (WebClient CLIENT = new WebClient())
                {
                    string RAW = CLIENT.DownloadString(BASEURL + PHP);
                    if (IS_COMMAND)
                    {
//this is a command, I remove the unique command ID so that previous commands and new ones aren't repeated if they have been submited more than once
                        CURRENT_ID = RAW.Remove(5, RAW.Length - 5);
                        return RAW.Remove(RAW.Length - 154, 154).Replace(CURRENT_ID, "");
                    }
                    else { return RAW.Remove(RAW.Length - 154, 154); } //this part removes extra string from server analytics a pain in the ***.
                }
            }
            static string TIMESTAMP()
            { 
                return DateTime.Now.ToString("M/d/yyy") + " - " + DateTime.Now.ToString("HH:mm:ss tt"); //Time to send to server
            }
            static void Main(string[] args)
            {
                using (WebClient CLIENT = new WebClient())
                {
                    Boolean CONNECTED = false;
                    String Username = Environment.UserName;
                    while (true)
                    {
                        while (CONNECTED == false)
                        {
                            if (GET("REQUEST=ONLINE",false) == "TRUE")
                            {
                                CONNECTED = true;
                            }
                        }
                        if (CONNECTED)
                        {
                            if (GET("REQUEST=CHECK",false) == "FALSE")
                            {
                                CLIENT.OpenRead(BASEURL + "REQUEST=ADD");
                            }
                            CLIENT.OpenRead(BASEURL + "DATA=" + Username + "\r\nLast online at " + TIMESTAMP());
                            try
                            {
//this is where it gets stuck

                                String COMMAND = GET("REQUEST=COMMAND",true);
                                if (CURRENT_ID != OLD_ID)
                                {
                                    OLD_ID = CURRENT_ID; //Set new ID 
                                    MessageBox.Show(COMMAND); //Show what Commands was sent by server
                                }
                            }
                            catch
                            {
                                CONNECTED = false; 
                            }
                        }
                    }
                }
            }
        }
    }

问题
在第一个循环中,它工作得非常好:连接、检查服务器是否识别它,然后检查命令。但是,当它再次循环时,它会发送日志,但仍停留在:

String COMMAND = GET("REQUEST=COMMAND",true);
它不会给我任何错误,但当我将鼠标悬停在web客户端上时,它会给我以下信息:

我看过这篇文章,但它没有向我解释如何在我的情况下避免这种情况

此WebClient卡在第二个循环上有什么问题?


详细信息

  • 我正在使用.NET4.5
  • Windows 7 64位
  • 视觉工作室2012
  • 服务器在线,工作正常
返回一个流,该流需要传递给流读取器以读取响应

在您的情况下,您根本没有使用返回的流。由于您正在重用webclient实例,我猜这就是导致您提到的行为的原因。

返回一个流,需要将该流传递给流读取器以读取响应


在您的情况下,您根本没有使用返回的流。由于您正在重用webclient实例,我猜这就是导致您提到的行为的原因。

下载字符串可能需要一段时间。如果不部署发行版二进制文件,在调试时可能会看到更好的信息。暂时用调试二进制文件替换二进制文件,然后重试。下载字符串可能需要一段时间,原因很多。如果不部署发行版二进制文件,在调试时可能会看到更好的信息。暂时用调试二进制文件替换二进制文件,然后重试。它不是OpenRead,而是DownloadString。我没有收到服务器的响应,因此它不会将信息交换回客户端。也许我错过了实际的流程。它不是OpenRead,而是DownloadString。我没有收到服务器的响应,因此它不会将信息交换回客户端。也许我错过了真正的流程。