2011-12-17 125 views
3

我有一個用C#編寫的客戶端/服務器應用程序。當我向服務器發送消息字符串時,它的工作正常。但我需要發送(簡單)對象到服務器而不是字符串。但我不知道如何做到這一點。我現在有這爲我的客戶:用C#發送對象到服務器#

類我想送:

[Serializable] 
public class Actions 
{ 
// Movement 
public bool forward = false; 
public bool left = false; 
public bool backward = false; 
public bool right = false; 
} 

然後我送使用默認的send()命令的對象。但是,happends前我第一次動作類轉換爲字節數組,像這樣:

public void SendObject (object obj) 
{ 
    this.socket.Send (this.ObjectToByteArray (obj)); 
} 

// Convert an object to a byte array 
private byte[] ObjectToByteArray(object obj) 
{ 
    if(obj == null) 
     return null; 

    BinaryFormatter bf = new BinaryFormatter(); 
    MemoryStream ms = new MemoryStream(); 
    bf.Serialize(ms, obj); 
    return ms.ToArray(); 
} 

在服務器端,我收到這樣的數據(和多數民衆都卻困於...) :

public void OnDataReceived(IAsyncResult asyn) 
{ 
    SocketPacket socketData = (SocketPacket)asyn.AsyncState; 
    try 
    { 
     // Complete the BeginReceive() asynchronous call by EndReceive() method 
     // which will return the number of characters written to the stream 
     // by the client 
     int iRx = socketData.m_currentSocket.EndReceive (asyn); 
     char[] chars = new char[iRx + 1]; 

     // CONVERT THE BYTE ARRAY BACK TO AN OBJECT 
     //object Cls = this.ByteArrayToObject (socketData.dataBuffer); 
    } 
    catch (...) { } 
} 

我該怎麼做才能訪問服務器上的對象?顯然,當我這樣做: Cls.forward;

然後它給我一個錯誤,因爲它不知道對象具有什麼屬性。任何人有任何想法如何做到這一點?

+0

1.你只想套接字嗎?還有其他的解決方案,如遠程或WCF。此外,當多個客戶commnuniate比它的問題。 2.另一種方式是通過這種方式 首先發送SizeofByarray 比發送對象數組。 – dotnetstep 2011-12-17 13:28:14

回答

2

投它從對象到Actions

object Cls = this.ByteArrayToObject (socketData.dataBuffer); 
Actions action = (Actions)Cls; 

這是做到這一點的最簡單方法。您還應該添加異常處理,類型檢查等。

+0

謝謝,作品非常出色。 – w00 2011-12-17 14:32:00

1

通常,客戶端和服務器都需要了解可通過連接序列化的對象類型。其次,你需要一種方式來表明你傳遞了什麼樣的對象,所以另一端知道如何反序列化它。這可以按照慣例(相同的調用總是發送相同類型的消息)或者與消息流中的附加數據。或者使用不同的序列化程序。

你看過WCF嗎?它提供了通過數據合約很好地抽象所有這些的方法。

+0

我無法使用WCF,因爲我使用的是遊戲引擎。 – w00 2011-12-17 14:06:38

+0

我不明白這兩件事情是如何相互衝突的,除非引擎包含實際的客戶端/服務器通信。 – Joe 2011-12-17 14:25:33