2012-08-28 38 views
1

發送枚舉值作爲「協議」我有一個Enum,後者是在客戶端和服務器共享的,這就決定如何處理該數據的其餘部分做的一部分經由TCP

客戶:

byte[] outStream = Encoding.UTF8.GetBytes((int)Shared.CommandType.ClientJoin + "sometext"); 
serverStream.Write(outStream, 0, outStream.Length); 
serverStream.Flush(); 

,並在服務器端:

string dataFromClient = null; 
byte[] bytesFrom = new byte[1024]; 
NetworkStream networkStream = tcpclient.GetStream(); 
int bytesread = networkStream.Read(bytesFrom, 0, bytesFrom.Length); 

Byte[] commandBytes = new Byte[4]; 
Array.Copy(bytesFrom, commandBytes, 4); 
dataFromClient = Encoding.UTF8.GetString(bytesFrom, 4, bytesread - 4); 

//test values 
int receivedcommand = BitConverter.ToInt32(commandBytes, 0); 
int actualcommand = (int)Shared.CommandType.ClientJoin; 

然而,所接收到的 '價值'(1634222896中測試)是與實際值完全不同的(0)

我敢肯定我正在做一些非常錯誤的事情,與字節數組分裂有關,但我不能爲我的生活看到什麼

任何想法?

(一如既往,如果有執行比上面一個更好的方法,我很願意聽取建議:))

+2

您發送的枚舉是十進制字符串,而不是4個字節。 – harold

+0

如果適用,您是否考慮過使用諸如soap或RESTful API之類的東西來實現此目的?通過這種方式,您可以在一端序列化對象,而在另一端則反序列化,而不需要太多的努力。 – series0ne

+0

哈羅德是正確的。剛剛檢查。嘗試檢查byte [] outStream = Encoding.UTF8.GetBytes(1234567890 +「」)的長度,以查看我的意思。 – Patrik

回答

1
byte[] outStream = Encoding.UTF8.GetBytes((int)Shared.CommandType.ClientJoin + "sometext"); 

成爲

byte[] outStream = Encoding.UTF8.GetBytes(0+ "sometext"); 

byte[] outStream = Encoding.UTF8.GetBytes("0sometext"); 

接收commandBytes會有字節後{'0','s','o','m'}

and BitConverter.ToInt32(commandBytes, 0);將只是一個4字節數組的整數表示,所有的其成員具有非零值(因爲全部都是ascii文本)。

+0

好吧,這是有道理的...所以我應該怎麼做呢? – LordAro

+0

以字節大小爲2 – perilbrain

+0

,但我將如何確保枚舉值作爲2字節int「傳輸」? – LordAro