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

时间:2017-02-07 20:24:42

标签: c# wpf mvvm

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

在服务器用户界面中,有三个文本框,用户可以在其中键入:

IP地址:(“127.0.0.1”)

端口:(某个端口)

Delimeter :(例如'@'之类的字符串

在这一方面,我面临的挑战是,无论用户提供什么样的分隔符,都应该在客户端项目中使用它,将其放入要发送的数据之间。例如,客户端发送:

姓名+ Delimeter + Surname + Delimeter +年龄

我尝试了什么:

我添加了一个带有静态字段的Utils类,用于IPAddress,端口和分隔符,如下所示:

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);
        }
    }

这里的问题是每当我启动一个新的Client实例时,util类中的值仍然是默认值(null)。

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

让我们分解你的问题:

  1. 服务器可以随意更改IP或端口,客户端会以某种方式猜测新端口并连接。
  2. 服务器随意更改分隔符,客户端适应新的分隔符。
  3. 问题1是不可能的。在客户端连接到服务器之前,信息无法神奇地传输到客户端,并且客户端需要ip和端口来连接到服务器。无论您使用什么技术将ip和端口传输到客户端都是比客户端/服务器更好的通信通道,因此您不需要客户端/服务器。

    问题2 has been solved by WCF already。使用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发送数据的编码细节,因为看起来你已经掌握了这一点。

答案 1 :(得分:0)

我能够以一种相当简单的方式解决这个问题。我以前解决的步骤如下:

在服务器中:

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

    1. 首先我从文件中读取。
    2. 接下来我创建了客户端实例,并将ip和port作为参数传递给它的构造函数。
    3. 感谢D Stanley和Damian Galletini的建议。还要感谢所有试图提供帮助的人。