我有一个对象列表,我想发送它认为TCP套接字连接。一种方法是获取对象列表并获取所有值,通过逗号和接收数据将它们分开,另一端和对象中的值。我是否可以发送对象列表,因为它可以在WCF Web服务中完成。你能告诉我怎么样?谢谢!
我之前已经为此创建了一个WCF服务但是因为它有一些无法解决的问题而改变了它。所以我正在创建这个客户端服务器应用程序。
此外,正在发送的数据每隔几秒刷新一次,很多用户都需要它。经过一些研究,我发现这将是一个更好的选择。
我有这个课程,我通过
发送我的信息public void SendMessage(string text)
{
Byte[] bytesSent = Encoding.UTF8.GetBytes(text);
SocketAsyncEventArgs writeEventArgs = new SocketAsyncEventArgs();
writeEventArgs.SetBuffer(bytesSent, 0, bytesSent.Length);
socket.SendAsync(writeEventArgs);
}
但是我宁愿先将对象序列化,然后发送它。所以我有一个流,需要作为字节数组。
这是我必须接收的数据:
void ReceiveData()
{
try
{
int recv;
string stringData;
while (true)
{
recv = socket.Receive(data);
stringData = Encoding.ASCII.GetString(data, 0, recv);
if (stringData == "bye")
break;
ClientDataRecievedEventArgs sd = new ClientDataRecievedEventArgs(stringData);
DataRecieved(this, sd);
}
stringData = "bye";
byte[] message = Encoding.ASCII.GetBytes(stringData);
socket.Send(message);
socket.Close();
this.Dispose();
return;
}
catch (Exception)
{
socket.Close();
this.Dispose();
}
}
这是我想要的:
SoapFormatter formatter = new SoapFormatter();
foreach (Communication.Client Client in server.ClientList)
{
foreach (ObjectLibrary.Model.PIP p in Repository.GlobalRepository.PIPInformation)
{
formatter.Serialize(stream, p);
Client.SendMessage(stream);
}
}
如何初始化流? 我需要将数据作为Stream来将其反序列化为Object。
所以我有对象列表我可以序列化整个列表吗?
答案 0 :(得分:7)
您必须“序列化”对象,并在另一侧反序列化它们。有关相关信息,请参阅http://msdn.microsoft.com/en-us/library/system.serializableattribute.aspx。
但是,您必须小心,如果在发送数据时连接发生了某些事情,您可能没有足够的数据来完全重新创建对象,并且您的程序可能会在某些意外的地方失败。只有在收到所有内容时才创建对象。
答案 1 :(得分:2)
你有很多用于序列化的对象,比如二进制,XML,JSON,但是还有一种远程处理方法,并不是说你可以创建Web服务。在最后两种情况下,'发送'和对象是微不足道的,它相当于将方法签名作为参数。
答案 2 :(得分:1)
为什么你想自己通过套接字发送数据,而执行此操作的协议(高于TCP)已经证明了它们的价值?
您必须创建一个协议来发送和接收数据,并实施此协议,您将花费大量时间处理之前已经完成并已经存在多年的事情。更不用说调试无聊的东西的时间可用于编程的较冷部分,将语言和框架用于“无聊”部分,并将它们链接在一起以解决您遇到的问题。
你必须关心的事情是针对不同数据对象和丢弃连接的exapmple分隔符(协议中的一种Content-Length头,告诉接收方它有多少数据可以预期)。
为什么不简单地使用WCF,作为SOAP,REST或JSON(如果另一方说的那样)的包装,或者如果要实现客户端和服务器,则使用Net.TCP?
然后你可以简单地调用服务方法MyObject[] GetObjects()
:框架将处理所有无聊的东西,并在客户端按原样接收MyObject数组。在后台,您将完成从HTTP标头到序列化到检测丢弃连接和抛出相关异常的所有内容。这节省了大量时间和麻烦。
或者您可以使用普通HTTP,创建一个小型Web应用程序,您可以在其中以您喜欢的序列化格式请求数据,并在通过HttpClient
接收后在客户端反序列化数据。