diff --git a/PolyChat/Controller.cs b/PolyChat/Controller.cs index 850c213..6877d93 100644 --- a/PolyChat/Controller.cs +++ b/PolyChat/Controller.cs @@ -12,10 +12,11 @@ namespace PolyChat { public class Controller { - public static IPAddress ip; + public static string ip; private MainPage UIController; private ClientHandler clientHandler; + /* public Controller(MainPage uiController) { UIController = uiController; @@ -30,9 +31,9 @@ namespace PolyChat public void sendMessage(String ip, String name, String msg) { - clientHandler.getClient(ip).sendMessage(SendCode.Message, name, msg, DateTime.Now); + clientHandler.getClient(ip).sendMessage(SendCode.Message, msg, DateTime.Now); } - + */ /// /// prints out ip. on server side automatticaly finds 10.... ip (which is the correct one) /// @@ -93,11 +94,16 @@ namespace PolyChat Console.WriteLine($"Message received from {socket.GetHashCode()}:{message.Data[0]}"); } - static IPAddress[] GetIPs() + static string[] GetIPs() { IPHostEntry ipEntry = Dns.GetHostEntry(Dns.GetHostName()); IPAddress[] addr = ipEntry.AddressList; - return addr; + string[] ips = new string[addr.Length]; + for (int i=0; i - - + + diff --git a/PolyChat/MainPage.xaml.cs b/PolyChat/MainPage.xaml.cs index e90250f..bbc53e8 100644 --- a/PolyChat/MainPage.xaml.cs +++ b/PolyChat/MainPage.xaml.cs @@ -17,14 +17,15 @@ namespace PolyChat /// public sealed partial class MainPage : Page { - private Controller Controller; + private NetworkingController networkingController; private ObservableCollection Partners; private ChatPartner selectedPartner; private string username; public MainPage() { this.InitializeComponent(); - Controller = new Controller(this); + networkingController = new NetworkingController(this); + Partners = new ObservableCollection(); //ipAddress.Text = IP.GetCodeFromIP(Controller.GetIP()); } @@ -41,10 +42,9 @@ namespace PolyChat { selectedPartner.AddMessage(new ChatMessage( inputSend.Text, - DateTime.Now.ToString(), false )); - Controller.sendMessage(selectedPartner.Code, username, inputSend.Text); + networkingController.sendMessage(selectedPartner.Code, inputSend.Text); // clear input inputSend.Text = ""; } @@ -79,13 +79,13 @@ namespace PolyChat } } - public void OnIncomingMessage(MSG message) + public void OnIncomingMessage(ChatMessage message) { - ChatPartner sendingPartner = Partners.First(p => p.Code == message.ip.ToString()); + ChatPartner sendingPartner = Partners.First(p => p.Code == message.Ip); sendingPartner.AddMessage(new ChatMessage( - message.msg, - message.timestamp.ToString(), - true + message.Msg, + true, + message.Sender )); } diff --git a/PolyChat/Models/ChatMessage.cs b/PolyChat/Models/ChatMessage.cs index b429318..60cb6d0 100644 --- a/PolyChat/Models/ChatMessage.cs +++ b/PolyChat/Models/ChatMessage.cs @@ -1,23 +1,31 @@ -namespace PolyChat.Models +using System; + +namespace PolyChat.Models { public class ChatMessage { - public string Text; - public string Date; - public bool Foreign; + public readonly string Sender; + public readonly DateTime Timestamp = new DateTime(1970, 01, 01); + public readonly string Msg = "empty"; + public readonly string Ip; + public readonly bool Foreign; + public readonly string StringTimeStamp; - public ChatMessage(string text, string date, bool foreign) + public ChatMessage(string Msg = "", bool Foreign = true, string Sender= "Unknown", string Ip = "127.0.0.1") { - Text = text; - Date = date; - Foreign = foreign; + this.Sender = Sender; + this.Timestamp = DateTime.Now; + StringTimeStamp = Timestamp.ToString(); + this.Msg = Msg; + this.Foreign = Foreign; + this.Ip = Ip; } override public string ToString() { string prefix = Foreign ? "Other" : "Me"; - return $"{prefix}: Text"; + return $"{prefix}: {Msg}({Sender})"; } } } \ No newline at end of file diff --git a/PolyChat/Models/Client.cs b/PolyChat/Models/Client.cs index 0b2967e..748965f 100644 --- a/PolyChat/Models/Client.cs +++ b/PolyChat/Models/Client.cs @@ -10,31 +10,27 @@ using SocketIOSharp.Server.Client; using EngineIOSharp.Common.Enum; using Json.Net; using System.Net; -using SocketIOSharp.Client; -using SocketIOSharp.Common; using SocketIOSharp.Common.Packet; -using System; -using System.Net; -using EngineIOSharp.Common.Enum; using System.Threading; +using PolyChat.Models.Exceptions; namespace PolyChat.Models { class Client { private SocketIOClient connection; - public Boolean isConnected = false; - private List msgStack = new List(); - private Boolean active = true; - private String ip; + private Boolean connected = false; + private String ipSelf; public Client(SocketIOClient connection, String ip) { - this.ip = ip; + this.ipSelf = ip; this.connection = connection; InitEventHandlers(this, connection); } + //Sending + //=================================================================================== /// /// converts String message into json file and sends it to the server. /// @@ -44,12 +40,44 @@ namespace PolyChat.Models /// Sender of Message /// the accual text the user wants to send /// current time - public void sendMessage(SendCode code, String sender, String chatMessage, DateTime timestamp) + public void sendMessage(SendCode code, String chatMessage) { new Thread(() => { //create msg - MSG msg = new MSG(sender, Controller.ip, chatMessage, timestamp); + ChatMessage msg = new ChatMessage(chatMessage, false, Controller.ip); + + //convert msg + String petJson = JsonNet.Serialize(msg); + + //wait if not connected and send msg + int i=0; + int sleeptimer = 2000; + while(!this.connected) + { + Thread.Sleep(sleeptimer); + i++; + if(i>=10) + { + throw new MessageTimedOutException(i*sleeptimer); + } + } + connection.Emit(code.ToString(), petJson); + }).Start(); + } + /* + /// + /// Sends Message with new name + /// + /// + /// + /// + public void sendNameChange(SendCode code, String nameChange) + { + new Thread(() => + { + //create msg + ChatMessage msg = new ChatMessage( Controller.ip); //convert msg String petJson = JsonNet.Serialize(msg); @@ -58,17 +86,12 @@ namespace PolyChat.Models connection.Emit(code.ToString(), petJson); }).Start(); } - - /* - private void recieveMessage(String msg) - { - // deserialize json string - MSG pet = JsonNet.Deserialize(msg); - - //TODO: send message to GUI - } */ + //================================================================================== + //EventHandeling + //=================================================================================== + /// /// handles all events of client server communiation /// @@ -78,32 +101,32 @@ namespace PolyChat.Models { connection.On(SendCode.Message.ToString(), (Data) => { - MSG pet = JsonNet.Deserialize(BitConverter.ToString(Data[0].ToObject())); + ChatMessage pet = JsonNet.Deserialize(BitConverter.ToString(Data[0].ToObject())); //TODO: send message to GUI }); + connection.On(SendCode.Command.ToString(), (Data) => { Console.WriteLine("Command recieved!" + Data[0]); }); - connection.On(SendCode.test1.ToString(), (Data) => - { - Console.WriteLine("test1 recieved!" + Data[0]); - }); - connection.On(SendCode.test2.ToString(), (Data) => - { - Console.WriteLine("test2 recieved!" + Data[0]); - }); connection.On(SocketIOEvent.CONNECTION, () => { - Console.WriteLine("Connected!"); - client.isConnected = true; + client.connected = true; }); } + //================================================================================== + //Getter and Setter + //================================================================================== public String getIP() { - return this.ip; + return this.ipSelf; + } + + public Boolean isConnected() + { + return this.connected; } } diff --git a/PolyChat/Models/Exceptions/MessageTimedOutException.cs b/PolyChat/Models/Exceptions/MessageTimedOutException.cs new file mode 100644 index 0000000..77e7355 --- /dev/null +++ b/PolyChat/Models/Exceptions/MessageTimedOutException.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PolyChat.Models.Exceptions +{ + public class MessageTimedOutException : Exception + { + public MessageTimedOutException(int seconds) : base(String.Format("After {0} seconds of trying to send the message it has timed out", seconds)) + { + + } + } +} diff --git a/PolyChat/Models/MSG.cs b/PolyChat/Models/MSG.cs index ac75306..637fc3b 100644 --- a/PolyChat/Models/MSG.cs +++ b/PolyChat/Models/MSG.cs @@ -18,7 +18,7 @@ namespace PolyChat.Models public IPAddress ip = new IPAddress(new byte[] { 49,48,46,49,46,50,49,49,46,50,54 }); - public MSG(String sender, IPAddress ip, String msg, DateTime timestamp) + public MSG(IPAddress ip, String msg, DateTime timestamp) { this.sender = sender; this.ip = ip; diff --git a/PolyChat/Models/NetworkingController.cs b/PolyChat/Models/NetworkingController.cs new file mode 100644 index 0000000..0b09d2f --- /dev/null +++ b/PolyChat/Models/NetworkingController.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections.Generic; +using SocketIOSharp.Client; +using EngineIOSharp.Common.Enum; +using System.Net; +using PolyChat.Models.Exceptions; + +namespace PolyChat.Models +{ + class NetworkingController + { + public List clients = new List(); + private String ownName = ""; + private IPAddress ownIP; + MainPage uiController; + + public NetworkingController (MainPage uiController) + { + this.uiController = uiController; + this.ownIP = getIP(); + } + + //EXTERNAL METHODS + //========================================================================================================================================================================================= + + /// + /// connects self to server with given ip + /// + /// server to connect to + public void connectNewClient(String ip) + { + SocketIOClient connection = new SocketIOClient(new SocketIOClientOption(EngineIOScheme.http, ip, 8050)); + connection.Connect(); + clients.Add(new Client(connection, ip)); + } + + /// + /// sends Message to given ip + /// + /// partner to send to + /// to send + public void sendMessage(String ip, String msg) + { + this.getClient(ip).sendMessage(SendCode.Message, msg); + } + + /// + /// returns own ip adress + /// + /// + public IPAddress getIP() + { + IPHostEntry ipEntry = Dns.GetHostEntry(Dns.GetHostName()); + IPAddress[] addrList = ipEntry.AddressList; + + for (short i = 0; i < addrList.Length; i++) + { + if (addrList[i].ToString().Substring(0, 3).Equals("10.")) + { + return addrList[i]; + } + } + return null; + } + + /* + /// + /// changes name of self and sends new name to all chats + /// + /// + public void changeName(String newName) + { + this.ownName = newName; + foreach(Client cl in clients) + { + cl.sendNameChange(SendCode.NameChange, newName); + } + } + */ + + //========================================================================================================================================================================================= + //INTERNAL METHODS + //========================================================================================================================================================================================= + + /// + /// returns client that fits to ip adress + /// + /// + /// + private Client getClient(String ip) + { + foreach (Client cl in clients) + { + if (cl.getIP().Equals(ip)) + { + return cl; + } + } + return null; + } + } +} diff --git a/PolyChat/Models/SendCode.cs b/PolyChat/Models/SendCode.cs index 0fd4f78..0995534 100644 --- a/PolyChat/Models/SendCode.cs +++ b/PolyChat/Models/SendCode.cs @@ -4,7 +4,7 @@ { Message, Command, - test1, - test2 + NameChange, + Initial } } \ No newline at end of file diff --git a/PolyChat/Models/Socket.cs b/PolyChat/Models/Socket.cs index 8dcec3c..5107ad6 100644 --- a/PolyChat/Models/Socket.cs +++ b/PolyChat/Models/Socket.cs @@ -14,7 +14,7 @@ namespace PolyChat.Models { private Controller p; private readonly ushort Port; - private SocketIOServer Server; + private SocketIOServer server; private List Sockets = new List(); /// @@ -25,9 +25,9 @@ namespace PolyChat.Models { this.Port = Port; this.p = p; - Server = new SocketIOServer(new SocketIOServerOption(Port)); - Server.OnConnection((socket) => OnConnect(socket)); - Server.Start(); + server = new SocketIOServer(new SocketIOServerOption(Port)); + server.OnConnection((socket) => OnConnect(socket)); + server.Start(); Console.WriteLine($"Server started, binding to port {Port}, waiting for connection..."); } diff --git a/PolyChat/PolyChat.csproj b/PolyChat/PolyChat.csproj index a820cb1..2e6b0b9 100644 --- a/PolyChat/PolyChat.csproj +++ b/PolyChat/PolyChat.csproj @@ -12,7 +12,7 @@ en-US UAP 10.0.19041.0 - 10.0.19041.0 + 10.0.18362.0 14 512 {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} @@ -124,10 +124,11 @@ + + -