отправка / получение объектов через tcpclient - PullRequest
1 голос
/ 31 октября 2010

Мне нужно отправлять / получать объекты (изготовленные мной по индивидуальному заказу) в моем приложении на C # .NET 4.0, и я хотел бы получить хорошее руководство, чтобы начать работу, потому что я искал в Google и, похоже, много проблем с сериализацией / десериализацией, и хотя проблемы были решены, есть много уродливых хаков.

С уважением, Александру Бадеску

Ответы [ 3 ]

2 голосов
/ 31 октября 2010

Я сделал транспорт, который делает именно это:

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/

1 голос
/ 31 октября 2010

Для связи по TCP / IP я настоятельно рекомендую FAQ Стивена Клири , вам следует обратить особое внимание на Фрейминг сообщений .Возможно, вы захотите взглянуть на его реализацию NitoSockets .

Все это при условии, что вы, конечно, не можете просто использовать WCF.

1 голос
/ 31 октября 2010

Если у вас есть контроль над объектами, вы можете украсить их атрибутом [Serializable] и использовать BinaryFormatter для сериализации / десериализации.

...