2013-05-03 4 views
1

Я хочу реализовать сервер, который имеет несколько методов, из которых можно принять массив двумерных точек (struct). Мне интересно, следует ли мне реализовать его как WebService или как простой TCP-сокет.Лучшая практика: отправка типизированных данных по TCP

Целевая система C++ работает на Debian Linux. Насколько я понимаю, WebService основан на XML/SOAP, и я могу использовать интерфейс, включая все его типы данных в любой другой клиентской системе. Напротив, простой TCP-сокет - это просто чтение байтовых массивов. Но есть ли простой способ добиться строго типизированной передачи данных с сокетами TCP, чтобы мне не нужен веб-сервер для работы с WebService?

Здесь C# пример того, что интерфейс сервера должен выглядеть следующим образом:

public interface IService 
{ 
    void CloseShutter(); 
    bool WriteFrame(Point[] frame, bool repeat); 
    MaintenanceInfo GetMaintenanceInfo(); 
} 

public struct Point 
{ 
    public float X { get; set; }  
    public float Y { get; set; } 
    public float Z { get; set; } 
    public int Color { get; set; } 
    public bool Draw { get; set; } 
} 

public struct MaintenanceInfo 
{ 
    public uint Lifetime { get; set; } 
    public bool UsedHours { get; set; } 
} 

Спасибо за любой посоветуйте.

Matthias

ответ

1

Использование слоя абстракции поверх TCP вместо обычных сокетов имеет много преимуществ. Обычно эти решения используют XML или любой сопоставимый для человека формат. Затем данные сериализуются и отправляются через стандартный сокет TCP. Таким образом достигается межплатформенная связь (здесь: C++, цель-C на C#), и вы можете использовать клиент/сервер в качестве объектов в вашем коде.

Один из лучших решений, которые я нашел до сих пор являются:

а) Apache Thrift: Pro: Простота установки и всего несколько строк автоматически генерируемой кода. Минусы: использует запатентованный формат данных, который не является XML.

b) gSOAP: Pro: Широко используется и основан на SOAP/XML WebServices. Минусы: Не так легко учиться.

c) CodeSynthesis XSD/e с Boost.Asio: Отправка и получение XML-документов (или объектов, которые могут быть преобразованы из и в XML) с использованием потоков с базовыми сокетами TCP. Pro: На основе сокетов нет SOAP/WebService. Минусы: требуется больше строк кода и больше обучения.

1

Вы можете использовать XML-RPC для C++: http://xmlrpc-c.sourceforge.net/

+0

Спасибо, я думаю, это именно то, что мне нужно. Я поближе рассмотрю этот вопрос. – Matthias

+0

Я дал эту попытку, но код был довольно сложным (хотя я в основном в коде C#). Общение с другими языками (клиентами), которые могут быть записаны в объектных c или C#, было сомнительным. Вот почему я не выбрал XML-RPC. – Matthias

1

Легкий способ заключается в использовании сериализации. Посмотрите на boost :: serialization namespace или любую другую библиотеку, которая делает это хорошо. Таким образом, вы можете писать сериализованные объекты непосредственно в потоке tcp и возвращать их обратно с другой стороны. Если вы хотите удобный для чтения формат, сериализуйте их как xml.

В противном случае вы можете скопировать необработанные структуры в выходной буфер. Вы можете отменить свою структуру, чтобы уважать стандартную стандартную сеть. Будьте также полезны для заполнения данных.

+0

Хорошая идея, я забыл об этом. Но как вы управляете тремя различными способами здесь? Тогда вам нужна какая-то начальная команда или? – Matthias

Смежные вопросы