我有两个项目的解决方案,分别充当服务器和客户端。客户端是一个简单的控制台应用程序,它将数据发送到服务器。服务器是一个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)。
感谢任何帮助。
答案 0 :(得分:1)
让我们分解你的问题:
问题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)
我能够以一种相当简单的方式解决这个问题。我以前解决的步骤如下:
在服务器中:
在客户端:
感谢D Stanley和Damian Galletini的建议。还要感谢所有试图提供帮助的人。