private static Packet SendMessage(Packet p)
        {
            PacketSendMessage packet = (PacketSendMessage)p;

            Console.WriteLine(packet.ToString());

            return(null);
        }
Example #2
0
 private static void Broadcast(Channel channel, Message message)
 {
     foreach (int userID in channel.GetUserList())
     {
         User user = User.GetUserByID(userID);
         if (user.socketID == 0)
         {
             continue;
         }
         PacketSendMessage packet = new PacketSendMessage();
         packet.userID    = user.id;
         packet.message   = message.GetContent();
         packet.ChannelID = channel.id;
         SendingQueue.Add(packet);
     }
 }
Example #3
0
 private static Packet AcceptMessage(Packet p)
 {
     try
     {
         PacketSendMessage packet  = (PacketSendMessage)p;
         Channel           channel = Channel.GetChannelById(packet.ChannelID);
         if (channel != null && channel.ContainsUser(packet.userID))
         {
             User_Message message =
                 new User_Message(packet.userID, packet.message, packet.ChannelID);
             channel.Add(message);
             Console.WriteLine(packet.ToString());
             Broadcast(channel, message);
         }
     }
     catch (Exception e)
     {
         Console.WriteLine(e.ToString());
     }
     return(null);
 }
Example #4
0
        public static void StartClient()
        {
            // Connect to a remote device.
            try {
                // Establish the remote endpoint for the socket.
                // The name of the
                // set to localhostd
                IPHostEntry ipHostInfo = Dns.GetHostEntry("127.0.0.1");
                IPAddress   ipAddress  = ipHostInfo.AddressList[0];
                IPEndPoint  remoteEP   = new IPEndPoint(ipAddress, port);

                // Create a TCP/IP socket.
                client = new Socket(ipAddress.AddressFamily,
                                    SocketType.Stream, ProtocolType.Tcp);

                // Connect to the remote endpoint.
                client.BeginConnect(remoteEP,
                                    new AsyncCallback(ConnectCallback), client);
                connectDone.WaitOne();

                // Send test data to the remote device.
                StateObject state = new StateObject();
                //SET UP THREAD for receive
                Thread receiveLoop = new Thread(new ThreadStart(() => {
                    try{
                        while (end)
                        {
                            Receive(client);
                            receiveDone.WaitOne();
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.ToString());
                    }
                }));
                receiveLoop.Start();



                //TEST SECTION
                ClientAccountRegister register = new ClientAccountRegister();
                register.login    = "******";
                register.name     = "user";
                register.password = "******";
                Send(client, Packet.Encode(PacketType.ClientAccountRegister, (ICanSerialize)register));
                sendDone.WaitOne();

                // register.login = "******";
                // register.name = "user2";
                // register.password = "******";
                // Send(client, Packet.Encode(PacketType.ClientAccountRegister, (ICanSerialize)register));
                // sendDone.WaitOne();

                // Console.WriteLine("Continue ...");
                // Console.ReadLine();

                ClientAccountLogin login = new ClientAccountLogin();
                login.login    = "******";
                login.password = "******";
                Send(client, Packet.Encode(PacketType.ClientAccountLogin, (ICanSerialize)login));
                sendDone.WaitOne();
                Console.WriteLine("Sent login.");

                Console.WriteLine("Continue ...");
                Console.ReadLine();

                ClientRequestChannelList requestList = new ClientRequestChannelList();
                Send(client, Packet.Encode(PacketType.ClientRequestChannelList, (ICanSerialize)requestList));
                sendDone.WaitOne();
                Console.WriteLine("Sent list request.");
                Console.ReadLine();


                ClientRequestChannelAccess request = new ClientRequestChannelAccess();
                request.id       = 1;
                request.SenderID = Session.currentUser.id;
                Send(client, Packet.Encode(PacketType.ClientRequestChannelAccess, (ICanSerialize)request));
                sendDone.WaitOne();
                Console.WriteLine("Sent request.");

                // Console.WriteLine("ANY KEY TO TERMINATE ...");
                // Console.ReadLine();

                PacketSendMessage p = new PacketSendMessage();
                p.ChannelID = 1;
                p.message   = "test";
                p.userID    = 1;

                // Send(client, Packet.Encode(PacketType.ClientSendMessage, (ICanSerialize)p));
                // sendDone.WaitOne();

                // Release the socket.
                Console.WriteLine("ANY KEY TO TERMINATE ...");
                Console.ReadLine();
                end = false;
                client.Shutdown(SocketShutdown.Both);
                client.Close();
            } catch (Exception e) {
                Console.WriteLine(e.ToString());
            }
        }
Example #5
0
        //Dispatcher logic layer
        public static void ReadCallback(IAsyncResult ar)
        {
            try{
                String content = String.Empty;

                //Retrieve the state object and the handler socket
                // from the async state object
                StateObject state   = (StateObject)ar.AsyncState;
                Socket      handler = state.workSocket;

                //Read data from the client socket
                int bytesRead = handler.EndReceive(ar);

                if (bytesRead > 0)
                {
                    state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));

                    content = state.sb.ToString();
                    if (content.Length > 0)
                    {
                        Packet pck = Packet.Parse(state.buffer);
                        //All the data has been read from the cient. Display it on the console
                        //Console.WriteLine("Read {0} bytes from socket. \n Data : ", content.Length, content);
                        //Business layer:
                        byte[] response = Dispatcher_Server.Switcher(pck);
                        if (response != null && response.Length > 0)
                        {
                            Send(handler, response);
                            sendDone.WaitOne();
                        }
                        if (Dispatcher_Server.SendingQueue.Count > 0)
                        {
                            //TODO: can tweak to accept generalized packet format, instead of specific
                            foreach (Packet sendingPacket in Dispatcher_Server.SendingQueue)
                            {
                                PacketSendMessage messagePacket = (PacketSendMessage)sendingPacket;
                                Send(Client_SocketID.list_clients[User.GetUserByID(messagePacket.userID).socketID],
                                     Packet.Encode(messagePacket.PacketType(), (ICanSerialize)messagePacket));
                                sendDone.WaitOne();
                            }
                        }
                        //client/user status as connected (set clientSocketID)
                        else if (Dispatcher_Server.loginPacket?.ID == PacketType.ServerAcknowledgementLogin.ID())
                        {
                            ServerAcknowledgementLogin loginPacket =
                                (ServerAcknowledgementLogin)Dispatcher_Server.loginPacket;
                            Client_SocketID.list_clients.Add(Client_SocketID.count++, handler);
                            User.GetUserByID(loginPacket.id).connectToCurrentClient(Client_SocketID.count);
                        }
                    }
                    else
                    {
                        ///Not all data received. Get more.
                        handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                                             new AsyncCallback(ReadCallback), state);
                    }
                }
                receiveDone.Set();
            }
            catch (System.Net.Sockets.SocketException e)
            {
                Console.WriteLine("Client disconnected");
                e.ToString();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }