Example #1
0
        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
            }
        }
Example #2
0
        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);
        }
Example #3
0
 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);
 }
Example #4
0
        //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;
            }
        }
Example #5
0
        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
            }
        }
Example #6
0
 private async Task receiveString(Commands.ServerCommands sCom, int dataSize)
 {
     receivedData = Encoding.Unicode.GetString(await receiveData(dataSize));
     await saveServerCommand(sCom);
 }
Example #7
0
 private void removeServerResponse(Commands.ServerCommands sCom)
 {
     serverMsgs.Remove(sCom);
 }
Example #8
0
 private bool checkServerResponse(Commands.ServerCommands sCom)
 {
     return(serverMsgs.Contains(sCom));
 }
Example #9
0
 private async Task saveServerCommand(Commands.ServerCommands sCom)
 {
     serverMsgs.Add(sCom); /*Console.WriteLine("Saved server command {0}: {1}.", sCom, serverMsgs.Contains(sCom));*/
 }
Example #10
0
 private async Task sendCommand(Commands.ServerCommands sCom)
 {
     await sendObject(sCom, null);
 }