From 6c75918d73a1ae5708791321ed9dab8845b3e8cd Mon Sep 17 00:00:00 2001 From: Chih-Hsuan Huang Date: Sat, 12 Mar 2016 13:15:50 -0700 Subject: [PATCH 1/3] Slightly Modified README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 169d1bc..658ccc0 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# MonoGameP2P (Simple-Approach: Client-Server Communication) +# MonoGameP2P (Client-Server Communication) 1. Build the project (ctrl-shift-b) 2. Launch Server instance (right click Server -> Debug -> Start new instance) -3. Launch one or two Client instance (right click Client -> Debug -> Start new instance) * 2 +3. Launch one or more Client instances (right click Client -> Debug -> Start new instance) 4. Follow on Client's view and input the request messages as prompted on the console. From e90ccbdecfc97d24ce8597c97ba8ae6b3e5364a4 Mon Sep 17 00:00:00 2001 From: Chih-Hsuan Huang Date: Sat, 12 Mar 2016 15:54:08 -0700 Subject: [PATCH 2/3] refactored clients into Peer and Client Class; started replaction with Replication class --- Client/Peer.cs | 181 ++++++++++++++------------------- Client/Program.cs | 231 +++++------------------------------------- Server/Program.cs | 25 ++++- Server/Replication.cs | 22 ++++ Server/Server.csproj | 1 + 5 files changed, 144 insertions(+), 316 deletions(-) create mode 100644 Server/Replication.cs diff --git a/Client/Peer.cs b/Client/Peer.cs index 809a658..9b7d4f3 100644 --- a/Client/Peer.cs +++ b/Client/Peer.cs @@ -19,8 +19,7 @@ public class Peer // Initalize variables for peer(client) connecting to other peers(clients) private TcpListener _peerListener; private List _peerSender; - private List _peersIPAddresses; - private List _peers; + private List> peersInfo; private Dictionary peersIDToPosition; private int portSender; private int portListener; @@ -31,22 +30,42 @@ public class Peer /// /// /// - public Peer(List peersIPAddress, int portSender, int portListener) + public Peer(string playerName, int portSender, int portListener, List> peersInfo) { /* Initializes the Listener */ + _peerSender = new List(); - TcpClient temp = null; - _peerSender.Add(temp); + _peerSender.Add(null); + + _peerListener = new TcpListener(IPAddress.Any, portListener); + peersIDToPosition = new Dictionary(); + + this.peersInfo = peersInfo; this.portListener = portListener; this.portSender = portSender; - peersIDToPosition = new Dictionary(); - _peerListener = new TcpListener(IPAddress.Any, portListener); + + new Thread(() => { + Console.WriteLine("\nDEBUG: Peer listen start"); + StartListenPeers(); + }).Start(); + + + while (true) + { + Console.Write("Enter request (turn, quit): "); + string req = Console.ReadLine(); + req += " " + peersInfo.Where(elem => elem.Item2 == playerName).First().Item3 + " " + 0; + + SendRequestPeers(req); + } } void EstablishConnection(Socket s, int id) { + Console.WriteLine("CONNECTED WITH YOU: " + s.RemoteEndPoint); + Console.WriteLine(); StringBuilder sb = new StringBuilder(); Console.WriteLine("Connection accepted from " + s.RemoteEndPoint); @@ -55,9 +74,9 @@ void EstablishConnection(Socket s, int id) sb.Append(Encoding.ASCII.GetString(buffer, 0, bytesRead)); - String requestMessage = sb.ToString().Trim().ToLower(); + string requestMessage = sb.ToString().Trim().ToLower(); - //Console.WriteLine("Recieved..."); + Console.WriteLine("DEBUG: Response: " + requestMessage); Console.WriteLine(requestMessage); string responseMessage = "I DO NOT UNDERSTAND THIS REQUEST"; @@ -66,12 +85,12 @@ void EstablishConnection(Socket s, int id) if (requestMessage.StartsWith(TURN)) { - if(!peersIDToPosition.ContainsKey(id)) + if (!peersIDToPosition.ContainsKey(id)) { - peersIDToPosition.Add(id, 0); + peersIDToPosition.Add(id, 0); } - responseMessage = "turn 0 1 \n\n"; + responseMessage = "TURN"; // Parse the request message string trimmedMessage = requestMessage.Trim(); @@ -88,7 +107,7 @@ void EstablishConnection(Socket s, int id) // Keep track of peers with their position - peersIDToPosition[numberOne] += numberTwo; + // peersIDToPosition[numberOne] += numberTwo; } else if (requestMessage.StartsWith(QUIT)) @@ -116,9 +135,9 @@ void EstablishConnection(Socket s, int id) // Keep track of peers with their position - peersIDToPosition[numberOne] += numberTwo; + // peersIDToPosition[numberOne] += numberTwo; } - + ASCIIEncoding asen = new ASCIIEncoding(); @@ -128,69 +147,37 @@ void EstablishConnection(Socket s, int id) s.Send(b); - Console.WriteLine("\nSent Acknowledgement"); - - } - - - public void StartListen() - { - /* Start Listeneting at the specified port */ - _peerListener.Start(); - - Console.WriteLine("The peer is running at port 9999..."); - Console.WriteLine("The local End point is :" + - _peerListener.LocalEndpoint); - int counter = 0; - do - { - counter++; - try - { - Console.WriteLine("Waiting for a connection {0} .....", counter); - Socket s = _peerListener.AcceptSocket(); - - new Thread(() => { - EstablishConnection(s, counter); - }).Start(); - - - - } - catch (Exception e) - { - Console.WriteLine("Something went wrong!"); - _peerListener.Stop(); - Console.WriteLine(e.StackTrace); - } - } while (true); - /* clean up */ - - } /// /// /// /// - public void SendRequest(string msg = "") + public void SendRequestPeers(string msg = "") { Parallel.ForEach(_peerSender, ps => - { + { ps = new TcpClient(); Console.WriteLine("Connecting....."); // use the ipaddress as in the server program - ps.Connect("127.0.0.1", portSender); Console.WriteLine("Connected"); + String reqMessage = msg; + if (msg == "") + { + Console.Write("Request message was empty, please re-enter: "); + + reqMessage = Console.ReadLine(); + } + Stream stm = ps.GetStream(); ASCIIEncoding asen = new ASCIIEncoding(); - byte[] ba = asen.GetBytes("turn"); + byte[] ba = asen.GetBytes(reqMessage); Console.WriteLine("Transmitting your request to the server.....\n"); stm.Write(ba, 0, ba.Length); @@ -203,54 +190,38 @@ public void SendRequest(string msg = "") }); } + public void StartListenPeers() + { + /* Start Listeneting at the specified port */ + _peerListener.Start(); - /// - /// - /// - /// - - - //static void Main(string[] args) - //{ - // try - // { - // Console.Write("Enter IGN: "); - // string pName = Console.ReadLine(); - // List test = new List(); - // test.Add("127.0.0.1"); - // test.Add("127.0.0.1"); - - // Peer client1 = new Peer(test, 8000, 9000); - // Peer client2 = new Peer(test, 9000, 8000); - // new Thread(() => - // { - // client1.StartListen(); - // }).Start(); - - // new Thread(() => - // { - // client2.StartListen(); - // }).Start(); - - // new Thread(() => - // { - // client2.SendRequest("quit 2 1 \n \n"); - // }).Start(); - - // new Thread(() => - // { - // client1.SendRequest("turn 2 1 \n \n"); - // }).Start(); - - // Console.Write("--See you next time--"); - // Console.Read(); - // } - - // catch (Exception e) - // { - // Console.WriteLine("Error..... " + e.StackTrace); - // } - //} + Console.WriteLine("The peer is running at port {0}...", portListener); + Console.WriteLine("The local End point is :" + + _peerListener.LocalEndpoint); + + int counter = 0; + do + { + counter++; + try + { + Console.WriteLine("Waiting for a connection {0} .....", counter); + Socket s = _peerListener.AcceptSocket(); + + new Thread(() => { + EstablishConnection(s, counter); + }).Start(); + } + catch (Exception e) + { + Console.WriteLine("Something went wrong!"); + _peerListener.Stop(); + Console.WriteLine(e.StackTrace); + } + } while (true); + /* clean up */ + + } } } diff --git a/Client/Program.cs b/Client/Program.cs index 50b5604..443fccc 100644 --- a/Client/Program.cs +++ b/Client/Program.cs @@ -14,11 +14,12 @@ public class ClientProgram { TcpClient client; private string playerName; - private bool inGame = false; + bool inGame = false; public const string REQ_GAME = "game"; public const string REQ_PLAYERS = "players"; public const string REQ_CANCEL = "cancel"; - public const string SERVER_IP = "127.0.0.1"; + //public const string SERVER_IP = "127.0.0.1"; + public const string SERVER_IP = "10.13.136.75"; const string RESP_SUCCESS = "success"; @@ -43,7 +44,7 @@ public ClientProgram(int portSender, int portListener, string player = "NewPlaye private void connectToServer() { client = new TcpClient(); - Console.WriteLine("Connecting....."); + Console.WriteLine("Connecting to Server....."); // use the ipaddress as in the server program @@ -53,16 +54,6 @@ private void connectToServer() } - private void inializePeers() - { - _peerSender = new List(); - _peerSender.Add(null); - - _peerListener = new TcpListener(IPAddress.Any, portListener); - peersIDToPosition = new Dictionary(); - } - - public void SendRequest(string msg = "") { @@ -108,7 +99,7 @@ public void SendRequest(string msg = "") connectToServer(); } } - + private int processResponse(string responseMessage) { @@ -162,211 +153,37 @@ private int processResponse(string responseMessage) } - public void SendRequestPeers(string msg = "") - { - Parallel.ForEach(_peerSender, ps => - { - ps = new TcpClient(); - Console.WriteLine("Connecting....."); - - // use the ipaddress as in the server program - ps.Connect("127.0.0.1", portSender); - - Console.WriteLine("Connected"); - - String reqMessage = msg; - if (msg == "") - { - Console.Write("Request message was empty, please re-enter: "); - - reqMessage = Console.ReadLine(); - } - - Stream stm = ps.GetStream(); - - ASCIIEncoding asen = new ASCIIEncoding(); - byte[] ba = asen.GetBytes(reqMessage); - Console.WriteLine("Transmitting your request to the server.....\n"); - - stm.Write(ba, 0, ba.Length); - - //byte[] bb = new byte[2048]; - //Console.WriteLine("Waiting"); - //int k = stm.Read(bb, 0, 2048); - - ps.Close(); - }); - - } - - public void StartListenPeers() - { - /* Start Listeneting at the specified port */ - _peerListener.Start(); - - Console.WriteLine("The peer is running at port {0}...", portListener); - Console.WriteLine("The local End point is :" + - _peerListener.LocalEndpoint); - int counter = 0; - do - { - counter++; - try - { - Console.WriteLine("Waiting for a connection {0} .....", counter); - Socket s = _peerListener.AcceptSocket(); - - new Thread(() => { - EstablishConnectionPeers(s, counter); - }).Start(); - - - - } - catch (Exception e) - { - Console.WriteLine("Something went wrong!"); - _peerListener.Stop(); - Console.WriteLine(e.StackTrace); - } - } while (true); - /* clean up */ - - - } - - void EstablishConnectionPeers(Socket s, int id) - { - StringBuilder sb = new StringBuilder(); - Console.WriteLine("Connection accepted from " + s.RemoteEndPoint); - - byte[] buffer = new byte[2048]; - int bytesRead = s.Receive(buffer); - - sb.Append(Encoding.ASCII.GetString(buffer, 0, bytesRead)); - - String requestMessage = sb.ToString().Trim().ToLower(); - - Console.WriteLine("DEBUG: Response: " + requestMessage); - - Console.WriteLine(requestMessage); - string responseMessage = "I DO NOT UNDERSTAND THIS REQUEST"; - - // When a peer is broadcasting its turn - if (requestMessage.StartsWith(TURN)) - { - - if (!peersIDToPosition.ContainsKey(id)) - { - peersIDToPosition.Add(id, 0); - } - - responseMessage = "TURN"; - - // Parse the request message - string trimmedMessage = requestMessage.Trim(); - List restOfMessageAfterTurn = trimmedMessage.Substring(4).ToList(); - - // Get the first number in the turn message - int numberOne = (int)Char.GetNumericValue(restOfMessageAfterTurn.SkipWhile(ch => - char.IsWhiteSpace(ch)).TakeWhile(ch => !char.IsWhiteSpace(ch)).First()); - - // Get the second the number in the turn message - int numberTwo = (int)Char.GetNumericValue(restOfMessageAfterTurn.SkipWhile(ch => - char.IsWhiteSpace(ch)).SkipWhile(ch => !char.IsWhiteSpace(ch)).SkipWhile(ch => - char.IsWhiteSpace(ch)).TakeWhile(ch => !char.IsWhiteSpace(ch)).First()); - - - // Keep track of peers with their position - // peersIDToPosition[numberOne] += numberTwo; - - } - else if (requestMessage.StartsWith(QUIT)) - { - if (!peersIDToPosition.ContainsKey(id)) - { - peersIDToPosition.Add(id, 0); - } - - responseMessage = "QUIT"; - - // Parse the request message - string trimmedMessage = requestMessage.Trim(); - List restOfMessageAfterTurn = trimmedMessage.Substring(4).ToList(); - - // Get the first number in the turn message - int numberOne = (int)Char.GetNumericValue(restOfMessageAfterTurn.SkipWhile(ch => - char.IsWhiteSpace(ch)).TakeWhile(ch => !char.IsWhiteSpace(ch)).First()); - - // Get the second the number in the turn message - int numberTwo = (int)Char.GetNumericValue(restOfMessageAfterTurn.SkipWhile(ch => - char.IsWhiteSpace(ch)).SkipWhile(ch => !char.IsWhiteSpace(ch)).SkipWhile(ch => - char.IsWhiteSpace(ch)).TakeWhile(ch => !char.IsWhiteSpace(ch)).First()); - - - - // Keep track of peers with their position - // peersIDToPosition[numberOne] += numberTwo; - } - - - ASCIIEncoding asen = new ASCIIEncoding(); - - byte[] b = asen.GetBytes(responseMessage + "\n\n"); - - Console.WriteLine("SIZE OF RESPONSE: " + b.Length); - - s.Send(b); - - } - - public void startClient() { - try { - while (true) { - if(!inGame) { + while (true) { + try { + while (true) { + if(!inGame) { - Console.Write("Send request (game, players, cancel): "); - var request = Console.ReadLine().Trim().ToLower(); + Console.Write("Send request (game, players, cancel): "); + var request = Console.ReadLine().Trim().ToLower(); - //Thread t = new Thread(() => { Console.WriteLine("Sending request \"{0}\"", request); SendRequest(request); - // }); - - // t.Start(); - } + } - else - { - break; + else + { + break; + } } - } - inializePeers(); - new Thread(() => { - Console.WriteLine("\nDEBUG: Peer listen start"); - StartListenPeers(); - }).Start(); + Peer peer = new Peer(playerName, portSender, portListener,peersInfo); - while (true) - { - Console.Write("Enter request (turn, quit): "); - string req = Console.ReadLine(); - req += " " + peersInfo.Where(elem => elem.Item2 == playerName).First().Item3 + " " + 0; - - SendRequestPeers(req); - } - - } catch (Exception e) { - Console.WriteLine("Something Wrong"); - client.Close(); - Console.Error.WriteLine(e.StackTrace); - }; + } catch (Exception e) { + Console.WriteLine("Something Wrong"); + client.Close(); + Console.Error.WriteLine(e.StackTrace); + }; + } } static void Main(string[] args) @@ -383,7 +200,7 @@ static void Main(string[] args) aClient.startClient(); - Console.Write("--See you next time--"); + Console.Write("--Program terminated. See you next time!--"); Console.Read(); } diff --git a/Server/Program.cs b/Server/Program.cs index c7e55e3..ac82413 100644 --- a/Server/Program.cs +++ b/Server/Program.cs @@ -32,8 +32,23 @@ public ServerProgram() playerQueue = new List(); matchingMRE = new ManualResetEvent(false); matchedMRE = new ManualResetEvent(false); - /* Initializes the Listener */ - listener = new TcpListener(IPAddress.Any, 8001); + /* Initializes the Listener */ + + IPHostEntry host; + string localIP = ""; + host = Dns.GetHostEntry(Dns.GetHostName()); + foreach (IPAddress ip in host.AddressList) + { + if (ip.AddressFamily == AddressFamily.InterNetwork) + { + localIP = ip.ToString(); + + } + } + + Console.WriteLine(localIP); + + listener = new TcpListener(IPAddress.Parse(localIP), 8001); } void EstablishConnection(Socket s, int id) @@ -158,11 +173,13 @@ void EstablishConnection(Socket s, int id) public void StartListen() { /* Start Listeneting at the specified port */ + listener.Start(); Console.WriteLine("The server is running at port 8001..."); - Console.WriteLine("The local End point is :" + - listener.LocalEndpoint); + Console.WriteLine("The local End point is :" + listener.LocalEndpoint); + + int counter = 0; do { diff --git a/Server/Replication.cs b/Server/Replication.cs new file mode 100644 index 0000000..a836be9 --- /dev/null +++ b/Server/Replication.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Server +{ + + class ReplicationManager + { + public static string primaryIp = "10.13.136.75"; + public static bool isPrimary = false; + + public ReplicationManager() + { + + } + + + } +} diff --git a/Server/Server.csproj b/Server/Server.csproj index fd97bf5..2e33ee9 100644 --- a/Server/Server.csproj +++ b/Server/Server.csproj @@ -43,6 +43,7 @@ + From aca9a3c1752bc50431bc7813dea0f2f6025dbaac Mon Sep 17 00:00:00 2001 From: Chih-Hsuan Huang Date: Sat, 12 Mar 2016 21:01:16 -0700 Subject: [PATCH 3/3] ReplicationManager Skeleton --- Server/Program.cs | 10 +++++++--- Server/Replication.cs | 35 ++++++++++++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/Server/Program.cs b/Server/Program.cs index ac82413..b4458b5 100644 --- a/Server/Program.cs +++ b/Server/Program.cs @@ -17,7 +17,10 @@ public class ServerProgram const string REQ_CANCEL = "cancel"; const string RESP_SUCCESS = "success"; - + + private ReplicationManager rm; + + public IPAddress thisLocalAddr; private List playerQueue; private List sockets; @@ -45,10 +48,11 @@ public ServerProgram() } } + thisLocalAddr = IPAddress.Parse(localIP); - Console.WriteLine(localIP); + rm = new ReplicationManager(this); - listener = new TcpListener(IPAddress.Parse(localIP), 8001); + listener = new TcpListener(thisLocalAddr, 8001); } void EstablishConnection(Socket s, int id) diff --git a/Server/Replication.cs b/Server/Replication.cs index a836be9..76a6178 100644 --- a/Server/Replication.cs +++ b/Server/Replication.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Net.Sockets; using System.Text; using System.Threading.Tasks; @@ -9,14 +10,42 @@ namespace Server class ReplicationManager { - public static string primaryIp = "10.13.136.75"; - public static bool isPrimary = false; + public static string primaryServerIp = "10.13.136.75"; + public static List listReplicas = new List(); - public ReplicationManager() + private TcpListener rmListener; + public ReplicationManager(ServerProgram replica) { + addReplica(replica); + // rmListener = new TcpListener(); } + public void addReplica(ServerProgram replica) + { + listReplicas.Add(replica); + } + + public void SendReplica() + { + + } + + public void ListenReplica() + { + + } + + public void MakeThisServerPrimary() + { + + } + + public bool IsPrimary(string ipAddr) + { + return ipAddr == primaryServerIp; + } + } }