Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#在不同项目中使用静态变量_C#_Wpf_Mvvm - Fatal编程技术网

c#在不同项目中使用静态变量

c#在不同项目中使用静态变量,c#,wpf,mvvm,C#,Wpf,Mvvm,我有一个包含两个项目的解决方案,分别充当服务器和客户端。客户端是一个向服务器发送数据的简单控制台应用程序。服务器是一个WPF应用程序,它接收数据并将其显示在datagrid中。这里使用的是MVVM方法 在服务器UI中,用户可以在三个文本框中键入: IP地址:(“127.0.0.1”) 端口:(某些端口) Delimeter:(例如,一些类似“@”的字符) 对于我来说,这个问题的挑战是,无论用户提供什么样的delimeter,它都应该被用于客户项目中,放在要发送的数据之间。例如,客户端发送: 姓名

我有一个包含两个项目的解决方案,分别充当服务器和客户端。客户端是一个向服务器发送数据的简单控制台应用程序。服务器是一个WPF应用程序,它接收数据并将其显示在datagrid中。这里使用的是MVVM方法

在服务器UI中,用户可以在三个文本框中键入:

IP地址:(“127.0.0.1”)

端口:(某些端口)

Delimeter:(例如,一些类似“@”的字符)

对于我来说,这个问题的挑战是,无论用户提供什么样的delimeter,它都应该被用于客户项目中,放在要发送的数据之间。例如,客户端发送:

姓名+Delimeter+姓氏+Delimeter+年龄

我尝试过的:

我添加了一个Utils类,其中包含IPAddress、port和delimeter的静态字段,如下所示:

public class Utils
{
    public static string IP_ADDRESS = " ";
    public static int PORT = 0;
    public static char DELIMETER = '\0';

}
然后,我尝试在我的ViewModel中更改这些值,其中绑定到UI的各个属性都是通过分配它们来更改的:

private void storeData()
{
    Utils.IP_ADDRESS = IP;
    Utils.PORT = Port;
    Utils.DELIMETER = Delimeter;
}
在客户端程序中:

static void Main(string[] args)
    {
        Client client = new Client(Utils.IP_ADDRESS, Utils.PORT);

        while (true)
        {
            client.SendData("some Name" + Utils.DELIMETER + "some Surname" +  Utils.DELIMETER + some Age + Utils.DELIMETER + "something else");
            Thread.Sleep(3000);
        }
    }
这里的问题是,每当我启动一个新的客户端实例时,util类中的值仍然是默认值(null)


感谢您的帮助。

我们来分析一下您的问题:

  • 服务器可以随意更改ip或端口,而客户端将以某种方式猜测新端口并进行连接
  • 服务器可以随意更改分隔符,客户机可以适应新的分隔符
  • 问题1是不可能的。在客户端连接到服务器之前,信息无法神奇地传输到客户端,客户端需要ip和端口才能连接到服务器。无论您使用何种技术将ip和端口传输到客户端,都比您的客户端/服务器具有更好的通信通道,因此您不需要客户端/服务器

    问题2。使用WCF和SOAP或REST(只是HTML)

    以下是在发送主请求之前,客户端确定分隔符的代码示例:

    class Server
    {
        private TcpListener _listener = new TcpListener(12312);            
        public void Start()
        {
            _listener.Start();
            while (true)
            {
                var client = _listener.AcceptTcpClient();
                var stream = client.GetStream();
                var request = getRequest(stream);
                if (request == "GetDelimiter")
                {
                    SendResponse(Utils.DELIMITER, stream);
                }
                else
                {
                    ProcessNameSurnameAge(request);
                }
            }
        }
    }
    
    class Client
    {
        private TcpClient _client = new TcpClient();
        public void DoTheThing()
        {
            _client.Connect("127.0.0.1", 12312);
            var stream = _client.GetStream();
            SendRequest("GetDelimiter", stream);
            var delimiter = GetResponse(stream);
            var newRequest = "some Name" + delimiter + "some Surname" + delimiter + "some Age" + delimiter + "something else";
            SendRequest(newRequest);
        }
    }
    

    请注意,我跳过了通过TCP发送数据的编码细节,因为您似乎已经掌握了这一点。

    我能够以一种非常简单的方式解决这个问题。我用来解决的步骤如下:

    在服务器中:

  • 在我的解决方案中创建了一个文本文件
  • 当服务器在我的视图模型中启动时,我将属性ip、port和delimeter保存在一个字符串数组中
  • 接下来,我使用IO File类将数组的内容写入文本文件
  • 在客户端:

  • 首先,我读了文件
  • 接下来,我创建了客户机实例,并将ip和端口作为参数传递给它的构造函数

  • 感谢D斯坦利和达米安·加列蒂尼的建议。还感谢所有其他试图提供帮助的人。

    您应该使用配置文件,并从/将共享变量(IP_地址、端口、分隔符)读/写到此文件中。您可以在客户端上使用与服务器上相同的表单,或从配置文件中读取连接信息。无需配置文件。当客户机连接到服务器时,应该有一个简短的协商:服务器在客户机连接上发送分隔符(只是分隔符的一条写线),客户机在连接后读取并存储分隔符(只是连接后的一条读线).@AdamSills如果客户端不知道服务器IP地址和端口,则无法进行任何协商。IP地址和端口是客户端与服务器通信所需的详细信息。您希望客户端在通信之前从服务器获取此信息吗?那是不可能的。您需要以某种方式将此信息发送给客户机,并且无论您使用何种方式发送该信息都比您的客户机/服务器通信更加可靠,因此这意味着您实际上是在自我短路。首先,感谢您的回答和努力。其次,在应用程序运行时,不允许连续更改ip地址、端口和delimeter的值。一旦设置了这些值,它们就不需要更改。最后,我以前从未使用过WCF,我正在寻找只使用WPF的解决方案。我强烈建议您学习WCF,因为它是.Net解决您问题的方法。您正在重新发明轮子。至于ip和端口,在客户端连接之前,服务器无法将该信息传递给客户端。使用TCP是不可能的。是否可以将ip和端口的值存储到一些变量中,然后在我声明客户机的类中(在另一个项目中)使用这些变量作为客户机构造函数的参数?Client Client=新客户端(字符串ip,int-port)否,这是不可能的。客户端和服务器是两个不同的进程,进程不能共享它们的变量。这就是TCP首先存在的原因。WCF正是微软针对您所面临问题的解决方案。请注意,项目和流程是两种不同的东西,但在您的情况下,每个项目最终都是一个流程。文件系统比您的客户机服务器好得多,因此您不需要客户机服务器。同意,但分配规定应实现服务器和多个客户机之间的tcp通信。我现在了解得更多。StackOverflow致力于解决实际问题。当问题与家庭作业有关时,最好明确说明,因为这通常涉及任意约束,比如你的约束。