2017-03-14 83 views
2

嘿我寫了一個簡單的應用程序,它是兩個玩家可以相互聊天,基本上玩。寫入特定字節C#

我的應用可以根據收到的數據類型執行不同的操作。

例如,如果播放器1向播放器2發送消息,則播放器2的客戶端上的應用程序識別它是消息類型,並且觸發更新GUI的合適事件。另一方面,如果玩家1進行移動,則玩家2的客戶端應用程序認識到它是移動類型並且執行合適的事件。

因此,它是用於數據緩衝器

Byte[] buffer = new Byte[1024]; 

是否有可能在buffer[0]類型的數據的寫入(1 - MSG,2 - MV)和數據的其餘部分的字節休息?或者,有沒有更好的方式來實現這種功能?

回答

5

你可以使用BinaryReader/Writer。

例如:

發信人:

Byte[] buffer = new Byte[1024]; 

MemoryStream stream = new MemoryStream(buffer); 
BinaryWriter writer = new BinaryWriter(stream); 

writer.Write(1); // message type. (command) 
writer.Write("Hi there"); 
writer.Write(3.1415); 

使用stream.Position以確定寫入的數據的長度。


接收機:

Byte[] buffer = new Byte[1024]; 

MemoryStream stream = new MemoryStream(buffer); 
BinaryReader reader = new BinaryReader(stream); 

int command = reader.ReadInt32(); 

switch(command) 
{ 
    case 1: // chat message 
     string message = reader.ReadString(); 
     double whateverValue = reader.ReadDouble(); 
     break; 

    case 2: // etc. 
     break; 
} 
+0

作爲一個小紙條,'寫(字符串)「與其他非.NET系統具有」非高「互操作性(因爲它以特定的方式格式化字符串,在字符串前添加7位編碼長度),PLUS默認編碼」BinaryWriter「是UTF8(這不是問題,只是一個信息)。其他的'Write(something)'都非常簡單,所以它們具有非常高的互操作性(ok ...'Write(decimal)'具有非常低的互操作性,因爲'decimal'只是.NET) – xanatos

2

約編組這些數據是什麼?如果你有,例如,含有用於「移動式」的結構體,你可以這樣做:

發件人:

SOME_STRUCT data = new SOME_STRUCT(); 
int structSize = Marshal.SizeOf(data); 
// you fill your struct here 
var msgBytes = new Byte[1024]; 

IntPtr pointer = Marshal.AllocHGlobal(structSize); 
Marshal.StructureToPtr(data, pointer, true); 
Marshal.Copy(pointer, msgBytes, 0, size); 
Marshal.FreeHGlobal(pointer); 

接收機:

SOME_STRUCT receivedData = new SOME_STRUCT(); 
int structSize = Marshal.SizeOf(data); 
// You receive your data here 
var receivedBytes = msgBytes; 

GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned); 
IntPtr pointer = handle.AddrOfPinnedObject(); 
Marshal.Copy(receivedBytes, 0, pointer, (int)structSize); 
+0

使用結構的缺點是;固定長度,字符串和結構s..ks,您需要將第一個int定義爲數據包類型。但是..它會起作用。 –

+0

這是真的,但是如果你有很多事情正在進行「移動」或「消息」,它們會使代碼更加可持續,並且不那麼混亂。 – ArenaLor

+0

我不同意這一點。使用結構化序列化太僵化。當你想用列表等序列化對象時會發生問題。有很多方法可以自動使用對象中的二進制讀取器/編寫器。例如強制序列化/反序列化方法的接口。我更喜歡'BinarySerializer'而不是結構。這隻在服務器和客戶端是.NET時纔算。就像我所說的,使用結構體並不壞,但這只是我的看法。 –