2013-05-03 78 views
1

我想实现一个服务器,它有几个方法可以从一个接受二维点(一个结构)数组的方法。我想知道是否应该将它作为WebService或作为简单的TCP套接字来实现。最佳实践:通过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; } 
} 

感谢您的任何建议。

马蒂亚斯

回答

1

在TCP之上使用抽象层而不是普通套接字有很多优点。通常这些解决方案使用XML或任何可比较的人类可读格式。然后将数据序列化并通过标准TCP套接字发送。通过这种方式可以实现跨平台通信(这里是:C++,Objective-C到C#),您可以将客户端/服务器用作代码中的对象。

一个我迄今为止所发现的最佳解决方案是:

一)Apache Thrift:优点:易于设置和自动生成的代码只有几行。缺点:使用不是XML的专有数据格式。

b)gSOAP:Pro:广泛使用并基于SOAP/XML WebServices。缺点:不容易学习。

c)CodeSynthesis XSD/eBoost.Asio:使用带有底层TCP套接字的流发送和接收XML文档(或可以从XML转换为XML的对象)。 Pro:基于套接字,不需要SOAP/WebService。缺点:需要更多的代码和更多的学习。

1

您可以使用XML-RPC为C++:http://xmlrpc-c.sourceforge.net/

+0

谢谢,我想这正是我需要的。我会仔细研究一下。 – Matthias 2013-05-03 14:12:19

+0

我试了一下,但是代码有点复杂(尽管我大部分都是C#代码)。与可能用Objective-C或C#编写的其他语言(客户端)的通信是有问题的。这就是为什么我没有选择XML-RPC。 – Matthias 2013-05-12 11:54:39

1

一个轻量级的方式是使用序列化。看一看boost :: serialization命名空间或其他任何可以做得好的库。这样,你可以直接在TCP流中写入序列化的对象,并让它们回到另一端。如果你想要一个可读的格式,请将它们序列化为xml。

否则,您可以将原始结构复制到输出缓冲区中。你可以反转你的结构以遵守网络标准的字节顺序。也是数据填充的carrefull。

+0

不错的主意,我忘记了。但是,您如何在这里管理三种不同的方法?那么你需要某种初始命令,或者? – Matthias 2013-05-03 14:06:19