c#在不同项目中使用静态变量
我有一个包含两个项目的解决方案,分别充当服务器和客户端。客户端是一个向服务器发送数据的简单控制台应用程序。服务器是一个WPF应用程序,它接收数据并将其显示在datagrid中。这里使用的是MVVM方法 在服务器UI中,用户可以在三个文本框中键入: IP地址:(“127.0.0.1”) 端口:(某些端口) Delimeter:(例如,一些类似“@”的字符) 对于我来说,这个问题的挑战是,无论用户提供什么样的delimeter,它都应该被用于客户项目中,放在要发送的数据之间。例如,客户端发送: 姓名+Delimeter+姓氏+Delimeter+年龄 我尝试过的: 我添加了一个Utils类,其中包含IPAddress、port和delimeter的静态字段,如下所示:c#在不同项目中使用静态变量,c#,wpf,mvvm,C#,Wpf,Mvvm,我有一个包含两个项目的解决方案,分别充当服务器和客户端。客户端是一个向服务器发送数据的简单控制台应用程序。服务器是一个WPF应用程序,它接收数据并将其显示在datagrid中。这里使用的是MVVM方法 在服务器UI中,用户可以在三个文本框中键入: IP地址:(“127.0.0.1”) 端口:(某些端口) Delimeter:(例如,一些类似“@”的字符) 对于我来说,这个问题的挑战是,无论用户提供什么样的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)
感谢您的帮助。我们来分析一下您的问题:
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发送数据的编码细节,因为您似乎已经掌握了这一点。我能够以一种非常简单的方式解决这个问题。我用来解决的步骤如下: 在服务器中:
感谢D斯坦利和达米安·加列蒂尼的建议。还感谢所有其他试图提供帮助的人。您应该使用配置文件,并从/将共享变量(IP_地址、端口、分隔符)读/写到此文件中。您可以在客户端上使用与服务器上相同的表单,或从配置文件中读取连接信息。无需配置文件。当客户机连接到服务器时,应该有一个简短的协商:服务器在客户机连接上发送分隔符(只是分隔符的一条写线),客户机在连接后读取并存储分隔符(只是连接后的一条读线).@AdamSills如果客户端不知道服务器IP地址和端口,则无法进行任何协商。IP地址和端口是客户端与服务器通信所需的详细信息。您希望客户端在通信之前从服务器获取此信息吗?那是不可能的。您需要以某种方式将此信息发送给客户机,并且无论您使用何种方式发送该信息都比您的客户机/服务器通信更加可靠,因此这意味着您实际上是在自我短路。首先,感谢您的回答和努力。其次,在应用程序运行时,不允许连续更改ip地址、端口和delimeter的值。一旦设置了这些值,它们就不需要更改。最后,我以前从未使用过WCF,我正在寻找只使用WPF的解决方案。我强烈建议您学习WCF,因为它是.Net解决您问题的方法。您正在重新发明轮子。至于ip和端口,在客户端连接之前,服务器无法将该信息传递给客户端。使用TCP是不可能的。是否可以将ip和端口的值存储到一些变量中,然后在我声明客户机的类中(在另一个项目中)使用这些变量作为客户机构造函数的参数?Client Client=新客户端(字符串ip,int-port)否,这是不可能的。客户端和服务器是两个不同的进程,进程不能共享它们的变量。这就是TCP首先存在的原因。WCF正是微软针对您所面临问题的解决方案。请注意,项目和流程是两种不同的东西,但在您的情况下,每个项目最终都是一个流程。文件系统比您的客户机服务器好得多,因此您不需要客户机服务器。同意,但分配规定应实现服务器和多个客户机之间的tcp通信。我现在了解得更多。StackOverflow致力于解决实际问题。当问题与家庭作业有关时,最好明确说明,因为这通常涉及任意约束,比如你的约束。