通过TCP连接发送对象

时间:2016-02-02 13:58:36

标签: c# tcp windows-mobile windows-networking stream-socket-client

我今天启动了Windows移动编程,并且已成功连接到我的服务器。

我在Visual Studio上创建的应用程序不是通用应用程序,而是Windows Mobile应用程序。

API DataWriter用于将数据写入输出流,在应用程序方案中,输出流是套接字。即:

            DataWriter dw = new DataWriter(clientSocket.OutputStream);

我一直关注的方法之一是WriteBytesWriteBuffer (可以找到API documentation for DataWriter的文档

我使用哪种方法,为什么? 如何转换此类并使用上述方法将其发送到我的服务器。

    public class Message
    {
       public string pas { get; internal set; }
       public int type { get; internal set; }
       public string us { get; internal set; }#
    }

    //the below code goes in a seperate function 
    DataWriter dw = new DataWriter(clientSocket.OutputStream);
    Message ms = new Message();
    ms.type = 1;
    ms.us = usernameTextBox.Text;
    ms.pas = usernameTextBox.Text;
    //TODO: send ms to the server

1 个答案:

答案 0 :(得分:2)

在这两种方法之间,WriteBytes()似乎是更简单的方法。 WriteBuffer()为您提供了对输出缓冲区/流的更多控制,您可以在需要时随时使用它。但是,对于所有意图和目的,如果您只需要打开一个连接并发送一个字节流,WriteBytes()就可以完成这项工作。

  

如何转换此类并将其发送到我的服务器

这完全取决于你,真的。您要做的是定义如何“序列化”您的类通过连接进行传输(从而在其他代码时必须“反序列化”它接收数据)。

还有a few ways to do that等等。一个直截了当的方法(取自该链接问题的最佳答案)将是使用BinaryFormatter类。像这样:

var ms = new Message();
ms.type = 1;
ms.us = usernameTextBox.Text;
ms.pas = usernameTextBox.Text;

byte[] serializedMessage;
var formatter = new BinaryFormatter();
using (var stream = new MemoryStream())
{
    formatter.Serialize(stream, ms);
    serializedMessage = ms.ToArray();
}

// now serializedMessage is a byte array to be sent

然后在另一端你需要将它反序列化回一个对象实例。可能看起来像这样:

// assuming you have a variable called serializedMessage as the byte array received

Message ms;
using (var stream = new MemoryStream())
{
    var formatter = new BinaryFormatter();
    stream.Write(serializedMessage, 0, serializedMessage.Length);
    stream.Seek(0, SeekOrigin.Begin);
    ms = (Message)formatter.Deserialize(stream);
}

您当然可以在更简单的界面后面抽象这些。或者,如果您在序列化中寻找任何类型的人类可读性,您可以尝试类似JSON序列化程序并直接将字符串转换为字节数组等。

编辑:请注意,这只是“序列化”对象的众多方法之一的示例。并且,正如用户在下面的评论中指出的那样,使用这个二进制序列化器可能会有缺点。

可以使用任何序列化程序。你甚至可以自己做。技术上覆盖.ToString()以打印所有属性,然后调用它是一种序列化形式。概念总是相同的......将内存中对象转换为可传输的数据,以后可以构建相同的内存中对象。 (从技术上讲,保存到数据库是一种序列化形式。)