private async Task sendString(Commands.ServerCommands sCom, string str) { using (MemoryStream ms = new MemoryStream()) { //convert object to byte array byte[] data; if (str != "") { data = Encoding.Unicode.GetBytes(str); } //get data from string slightly differently than for objects because of encoding else { data = new byte[0]; } //send command number byte[] prep = BitConverter.GetBytes(Commands.getServerCommandUInt(sCom)); if (BitConverter.IsLittleEndian) //target computer might use different endian -> send and receive as big endian and if necessary, restore to little endian in client { Array.Reverse(prep); } await netS.WriteAsync(prep, 0, prep.Length); //write command (uint) to stream //send data size prep = BitConverter.GetBytes(data.Length); if (BitConverter.IsLittleEndian) { Array.Reverse(prep); } await netS.WriteAsync(prep, 0, prep.Length); //write length of data (int) to stream //send object await netS.WriteAsync(data, 0, data.Length); //write object to stream } }
private async Task receiveObject(Commands.ServerCommands sCom, int dataSize) { MemoryStream ms = new MemoryStream(await receiveData(dataSize)); BinaryFormatter bf = new BinaryFormatter(); ms.Position = 0; receivedData = bf.Deserialize(ms); await saveServerCommand(sCom); }
private async Task awaitServerResponse(Commands.ServerCommands sCom) { while (!serverMsgs.Contains(sCom)) { //Console.WriteLine("Didn't reveive {0} yet ({1}).", sCom, serverMsgs.Contains(sCom)); await Task.Delay(500); } //Console.WriteLine("###Received {0}.###", sCom); }
//information processing, client-server communication private async Task handleMessage(Commands.ServerCommands sCom, int dataSize) { Console.WriteLine("Handling message... {0}, {1}", sCom, dataSize); //note: this method isn't async, but it wouldn't be able to return async methods if it wasn't declared as one itself switch (sCom) { case Commands.ServerCommands.ValidVersionNumber: case Commands.ServerCommands.InvalidVersionNumber: case Commands.ServerCommands.UserAlreadyOnline: case Commands.ServerCommands.UserNameFound: case Commands.ServerCommands.UserNameNotFound: case Commands.ServerCommands.PasswordIncorrect: case Commands.ServerCommands.LoginSuccessful: case Commands.ServerCommands.AccountCreatedSuccessfully: case Commands.ServerCommands.ServerError: case Commands.ServerCommands.MessageSent: await saveServerCommand(sCom); Console.WriteLine("Received server command: {0}.", sCom); return; case Commands.ServerCommands.ReceiveString: await receiveString(sCom, dataSize); Console.WriteLine("Received string."); return; case Commands.ServerCommands.ReceiveList_String: await receiveObject(sCom, dataSize); Console.WriteLine("Received list of string."); return; case Commands.ServerCommands.MessageForwarded: await receiveObject(sCom, dataSize); removeServerResponse(sCom); Console.WriteLine("Received forwarded message."); myWindow.Dispatcher.BeginInvoke(new ChatMsgAdderDelegate(myWindow.addChatMessage), System.Windows.Threading.DispatcherPriority.Background, (ChatMessage)receivedData); break; case Commands.ServerCommands.OnlineUsersChanged: await receiveObject(sCom, dataSize); removeServerResponse(sCom); Console.WriteLine("Received online users."); //myWindow.updateUserList((List<string>)receivedData); //foreach (string user in ((List<string>)receivedData)) Console.WriteLine(user); updateUserList((List <string>)receivedData); break; default: Console.WriteLine("Unhandled server command ({0}).", sCom); return; } }
public async Task sendObject(Commands.ServerCommands sCom, object obj) { //see e.g.: https://stackoverflow.com/questions/2316397/sending-and-receiving-custom-objects-using-tcpclient-class-in-c-sharp using (MemoryStream ms = new MemoryStream()) { //convert object to byte array byte[] data; if (obj != null) { BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(ms, obj); //serialise object to memory stream first -> can provide size of data in byte data = ms.ToArray(); //the object converted to a byte array } else { data = new byte[0]; } //send command number byte[] prep = BitConverter.GetBytes(Commands.getServerCommandUInt(sCom)); if (BitConverter.IsLittleEndian) //target computer might use different endian -> send and receive as big endian and if necessary, restore to little endian in client { Array.Reverse(prep); } await netS.WriteAsync(prep, 0, prep.Length); //write command (uint) to stream //send data size prep = BitConverter.GetBytes(data.Length); if (BitConverter.IsLittleEndian) { Array.Reverse(prep); } await netS.WriteAsync(prep, 0, prep.Length); //write length of data (int) to stream //send object await netS.WriteAsync(data, 0, data.Length); //write object to stream } }
private async Task receiveString(Commands.ServerCommands sCom, int dataSize) { receivedData = Encoding.Unicode.GetString(await receiveData(dataSize)); await saveServerCommand(sCom); }
private void removeServerResponse(Commands.ServerCommands sCom) { serverMsgs.Remove(sCom); }
private bool checkServerResponse(Commands.ServerCommands sCom) { return(serverMsgs.Contains(sCom)); }
private async Task saveServerCommand(Commands.ServerCommands sCom) { serverMsgs.Add(sCom); /*Console.WriteLine("Saved server command {0}: {1}.", sCom, serverMsgs.Contains(sCom));*/ }
private async Task sendCommand(Commands.ServerCommands sCom) { await sendObject(sCom, null); }