通过 tcpclient 发送/接收对象

发布于 2024-09-30 03:54:22 字数 149 浏览 1 评论 0原文

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

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

I have to send/recieve objects (of a custom class made by me) in my C# .NET 4.0 application and I would like a good tutorial to get me started because I've searched on Google and there seem to be a lot of problems with serialization/deserialization and although the problems were solved, there are a lot of ugly hacks.

Regards,
Alexandru Badescu

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

喜爱皱眉﹌ 2024-10-07 03:54:22

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

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 /

I've made a transport that does just this:

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

The library is work in progress, but the BinaryTransport works. It will also attempt to reconnect if it get disconnected.

Example:

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; }
}

Update

I've made a new framework: http://blog.gauffin.org/2012/05/griffin-networking-a-somewhat-performant-networking-library-for-net/

转瞬即逝 2024-10-07 03:54:22

如果您可以控制对象,则可以使用 [ Serialized] 属性并使用 BinaryFormatter 用于序列化/反序列化。

If you have control over the objects you could decorate them with the [Serializable] attribute and use BinaryFormatter for serialization/deserialization.

愁杀 2024-10-07 03:54:22

对于 TCP/IP 通信,我强烈推荐 Stephen Cleary 的常见问题解答 ,您应该特别注意消息框架。您可能还想看看他的 NitoSockets 实现。

当然,所有这些都假设您不能只使用 WCF。

For TCP/IP communication I highly recommend Stephen Cleary's FAQ, you should pay special attention to Message Framing. You might also want to take a look at his NitoSockets implementation.

All that assuming you can't just use WCF, of course.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文