2013-05-03 77 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