【问题标题】:sending/receiving objects through tcpclient通过 tcpclient 发送/接收对象
【发布时间】:2013-06-20 19:48:12
【问题描述】:

我必须在我的 C# .NET 4.0 应用程序中发送/接收对象(我制作的自定义类),我想要一个很好的教程来帮助我入门,因为我在 Google 上搜索过,似乎有一个序列化/反序列化有很多问题,虽然问题解决了,但还是有很多丑陋的 hack。

问候, 亚历山德鲁·巴德斯库

【问题讨论】:

  • 您是在与非托管应用程序通信,还是两个端点都由您管理和控制?如果是后者,您可能需要考虑 WCF(可能带有 TCP/IP 绑定)
  • 注意:习惯上省略“你好”和“问候”。只要问这个问题:)
  • @ohadsc 两个端点都由我管理@tykhyy 我以后不考虑它们了:D
  • 然后考虑 WCF - 应该让您的生活更轻松。 msdn.microsoft.com/en-us/netframework/aa663324.aspx

标签: c# serialization tcpclient


【解决方案1】:

我已经制作了一个可以执行此操作的传输器:

http://fadd.codeplex.com/SourceControl/changeset/view/58859#1054822

库正在进行中,但 BinaryTransport 有效。如果断开连接,它也会尝试重新连接。

示例:

public class Example
{
    private BinaryTransport<Packet> _client;
    private ServerExample _server;

    public void Run()
    {
        // start server
        _server = new ServerExample();
        _server.Start(new IPEndPoint(IPAddress.Loopback, 1234));

        // start client
        _client = new BinaryTransport<Packet>(new IPEndPoint(IPAddress.Loopback, 1234));

        // send stuff from client to server
        _client.Send("Hello world!");

        // send custom object
        _client.Send(new User { FirstName = "Jonas", LastName = "Gauffin" });
    }
}


public class ServerExample
{
    private readonly List<BinaryTransport<Packet>> _clients = new List<BinaryTransport<Packet>>();
    private SimpleServer _server;

    private void OnClientAccepted(Socket socket)
    {
        var client = new BinaryTransport<Packet>(socket);
        client.Disconnected += OnDisconnected;
        client.ObjectReceived += OnObject;

        _clients.Add(client);
    }

    private void OnDisconnected(object sender, EventArgs e)
    {
        var transport = (BinaryTransport<Packet>) sender;
        transport.Disconnected -= OnDisconnected;
        transport.ObjectReceived -= OnObject;
    }

    private void OnObject(object sender, ObjectEventArgs<Packet> e)
    {
        Console.WriteLine("We received: " + e.Object.Value);
    }

    public void Start(IPEndPoint listenAddress)
    {
        _server = new SimpleServer(listenAddress, OnClientAccepted);
        _server.Start(5);
    }
}

[Serializable]
public class Packet
{
    public object Value { get; set; }
}

[Serializable]
public class User
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

更新

我制作了一个新框架:http://blog.gauffin.org/2012/05/griffin-networking-a-somewhat-performant-networking-library-for-net/

【讨论】:

  • 我看到了,谢谢 =) BinaryTransport 是库中的另一个类。
【解决方案2】:

如果您可以控制对象,则可以使用 [Serializable] 属性装饰它们并使用 BinaryFormatter 进行序列化/反序列化。

【讨论】:

    【解决方案3】:

    对于 TCP/IP 通信我强烈推荐Stephen Cleary's FAQ,你应该特别注意Message Framing。您可能还想看看他的 NitoSockets 实现。

    当然,前提是您不能只使用 WCF。

    【讨论】:

      猜你喜欢
      • 2013-06-17
      • 2011-04-06
      • 2018-05-03
      • 1970-01-01
      • 1970-01-01
      • 2011-12-12
      • 2015-07-12
      • 1970-01-01
      • 2014-12-30
      相关资源
      最近更新 更多