如何通过套接字C#发送对象

时间:2011-11-04 07:44:40

标签: c# sockets object tcp

我有一个对象列表,我想发送它认为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。

所以我有对象列表我可以序列化整个列表吗?

3 个答案:

答案 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接收后在客户端反序列化数据。