我想实现一个服务器,它有一些方法,从中接受一个二维点数组(一个结构)。我想知道我是应该将它实现为WebService还是简单的TCP套接字。
目标系统是在Debian Linux上运行的C ++。据我所知,WebService基于XML / SOAP,我可以在任何其他客户端系统上使用包括其所有数据类型的接口。相反,普通的TCP套接字只是读取字节数组。但有没有一种简单的方法来实现TCP套接字的强类型数据传输,这样我就不需要Web服务器来运行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
答案 0 :(得分:1)
您可以使用XML-RPC for C ++:http://xmlrpc-c.sourceforge.net/
答案 1 :(得分:1)
轻量级方法是使用序列化。看一下boost :: serialization命名空间或任何其他能很好地完成它的库。这样,您可以直接在tcp流中编写序列化对象,并将它们返回到另一端。如果您想要一个人类可读的格式,请将它们序列化为xml。
否则,您可以将原始结构复制到输出缓冲区中。您可以反转您的结构以尊重网络标准字节顺序。还要充分了解数据填充。
答案 2 :(得分:1)
在TCP而不是普通套接字上使用抽象层有许多优点。通常这些解决方案使用XML或任何类似的人类可读格式。然后将数据序列化并通过标准TCP套接字发送。通过这种方式实现了跨平台通信(此处为:C ++,objective-C到C#),您可以将客户端/服务器用作代码中的对象。
到目前为止,我找到的最佳解决方案之一是:
a)Apache Thrift:Pro:易于设置,只需几行自动生成的代码。缺点:使用非XML的专有数据格式。
b)gSOAP:Pro:广泛使用并基于SOAP / XML WebServices。缺点:不容易学习。
c)CodeSynthesis XSD/e Boost.Asio:使用具有底层TCP套接字的流发送和接收XML文档(或可以从XML转换为XML的对象)。 Pro:基于套接字,没有SOAP / WebService。缺点:更多代码行和更多必要的学习。