private static Packet SendMessage(Packet p) { PacketSendMessage packet = (PacketSendMessage)p; Console.WriteLine(packet.ToString()); return(null); }
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); } }
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); }
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()); } }
//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()); } }