2011-11-04 97 views
1

我有一個對象列表,我想發送它認爲TCP套接字連接。一種方法是獲取對象列表,並通過逗號和接收數據獲取將它們分開的所有值,另一方面獲取對象中的值和值。我可以發送一個對象列表,因爲它可以在WCF Web服務中完成。你能告訴我怎麼做?謝謝!如何通過套接字發送對象C#

我確實已經爲此創建了一個WCF服務,但改變了它,因爲它有一些無法解決的問題。所以我創建這個客戶端服務器應用程序。

此外,正在發送的數據每隔幾秒刷新一次,而且很多用戶都需要它。經過一番研究後,我發現這將是一個更好的選擇。

我有這個類與我是通過

public void SendMessage(string text) 
{ 
    Byte[] bytesSent = Encoding.UTF8.GetBytes(text); 
    SocketAsyncEventArgs writeEventArgs = new SocketAsyncEventArgs(); 
    writeEventArgs.SetBuffer(bytesSent, 0, bytesSent.Length); 
    socket.SendAsync(writeEventArgs); 
} 

送我的消息,但我會出來,而第一個序列化對象,然後將其發送。所以我有一個流,需要作爲一個字節數組。

這是我必須接受的數據:

void ReceiveData() 
{ 
    try 
    { 
     int recv; 
     string stringData; 
     while (true) 
     { 
      recv = socket.Receive(data); 
      stringData = Encoding.ASCII.GetString(data, 0, recv); 
      if (stringData == "bye") 
       break; 
      ClientDataRecievedEventArgs sd = new ClientDataRecievedEventArgs(stringData); 
      DataRecieved(this, sd); 
     } 
     stringData = "bye"; 
     byte[] message = Encoding.ASCII.GetBytes(stringData); 
     socket.Send(message); 
     socket.Close(); 
     this.Dispose(); 
     return; 
    } 
    catch (Exception) 
    { 
     socket.Close(); 
     this.Dispose(); 
    } 

} 

這是要我使用:

SoapFormatter formatter = new SoapFormatter(); 

foreach (Communication.Client Client in server.ClientList) 
{ 
    foreach (ObjectLibrary.Model.PIP p in Repository.GlobalRepository.PIPInformation) 
    { 

     formatter.Serialize(stream, p); 
     Client.SendMessage(stream); 
    } 
} 

如何初始化流? 我需要將數據作爲Stream將其反序列化爲Object。

所以我有對象列表我可以序列化整個列表?

+1

你有沒有嘗試從你的任何代碼?如果是,那麼你可以具體說明你在通過tcp套接字發送對象列表時面臨的問題。 –

+0

還檢查了這個線程[發送通過套接字序列化對象] [1] [1]:http://stackoverflow.com/q/1536169/164906 – ViktorZ

+0

@Taufiq:如果你有很強的等待時間要求(例如,你正在創建一個網絡化的第一人稱射擊遊戲或其他基於實時物理的遊戲),或者試圖實現一個新的或現有的低級互聯網協議,只有這樣我才能繼續使用基於套接字的方法。否則,我會考慮更簡單和更高層次的技術,如WCF。它更加靈活(就代碼分解而言),並且可以讓您避免在大多數情況下考慮大部分細節。 –

回答

7

你必須「序列化」這些對象,並在另一側對它們進行反序列化。有關這方面的信息,請參閱http://msdn.microsoft.com/en-us/library/system.serializableattribute.aspx

儘管如此,如果在發送數據時連接發生問題,可能沒有足夠的數據來完全重新創建對象,並且程序可能會在某些意外的地方失敗。只有在收到所有東西時才創建對象。

+0

對象列表? – thewayman

+0

或者序列化列表中的所有對象,並將序列化的數據放入一個大緩衝區並立即發送整個緩衝區;或者遍歷lsit列表,序列化一個對象並立即發送。如果您需要發送整個列表,第一種方法是最好的,第二種方法是發送部分列表(如果發生錯誤),則可以使用第二種方法。 –

2

你有很多用於序列化的對象,比如二進制,XML,JSON,但也有一種遠程方法,並不是說你可以創建Web服務。在最後兩種情況下,「發送」和對象是微不足道的,它等於將它作爲參數放入方法簽名中。

1

爲什麼你想通過套接字自己發送數據,而這樣做的協議(高於TCP)已經證明了它們的價值?

你必須創建一個協議來發送和接收數據,並實現這個協議,在那裏你將花費大量的時間在已經完成並已經存在多年的事情上。更不用說調試乏味的東西了,這些東西可以用於編程的一部分,爲「無聊」部分設置語言和框架,並將它們連接在一起解決您遇到的問題。

你必須關心的是用於不同數據對象和丟棄連接的實例分隔符(協議中的一種Content-Length頭,告訴接收方它有多少期望的數據)。

爲什麼不簡單地使用WCF作爲SOAP,REST或JSON的包裝(如果另一方說的話)或者Net.TCP如果要實現客戶端和服務器?

然後,您只需調用服務方法MyObject[] GetObjects():所有無聊的東西都將由框架處理,並且您在客戶端按原樣接收MyObject數組。在後臺從HTTP頭到序列化到檢測丟棄的連接和拋出相關的異常都將爲您完成。這節省了嚴重的時間和麻煩。

或者您可以使用普通的HTTP,創建一個小型的Web應用程序,您可以通過您喜歡的序列化格式請求數據,並在通過HttpClient收到數據後將客戶端數據反序列化。

+0

我已更新我的問題! – thewayman

+0

您遇到無法解決的WCF問題,因此您開始創建自己的圖層?你最好花更多的時間讓WCF工作。或者在IIS中託管數據並讓客戶端通過HTTP輪詢新數據。如果你沒有看到'if(stringData ==「bye」)break'有什麼問題;'我真的幫不了你。 – CodeCaster

+0

此代碼也來自一個更簡單的項目。這似乎工作正常,而且我在這個領域的骨幹,所以代碼if(stringData ==「bye」)break;有一個問題,我沒有看到它。請善意解釋謝謝。 – thewayman