static void Main() { TcpListener server = null; try { int L1 = 0, L2 = 0; bool wygrana1 = false, wygrana2 = false; string hostName = Dns.GetHostName(); // pobieranie nazwy Console.WriteLine("Nazwa serwera: " + hostName); // uzyskanie adresu IP string ip = Dns.GetHostByName(hostName).AddressList[0].ToString(); Console.WriteLine("Adres IP:" + ip); int port = 51997; server = new TcpListener(IPAddress.Any, port); server.Start(); Byte[] bytes1 = new Byte[3]; Byte[] bytes2 = new Byte[3]; const String id1 = "001", id2 = "010"; Komunikat komunikat1 = new Komunikat(), komunikat2 = new Komunikat(); { Console.WriteLine("Oczekiwanie na polaczenie obu klientow... "); TcpClient client = server.AcceptTcpClient(); NetworkStream stream1 = client.GetStream(); //nadanie identyfikatora klientowi 1 int i; while ((i = stream1.Read(bytes1, 0, bytes1.Length)) != 0) { komunikat1.ustaw(bytes1); if (komunikat1.GetOp() == "000001") { Console.WriteLine("Klient pierwszy polaczony! Nadano identyfikator " + Convert.ToInt32(id1, 2)); komunikat1.SetOp("000010"); komunikat1.SetId(id1); komunikat1.GetBitArray().CopyTo(bytes1, 0); stream1.Write(bytes1, 0, bytes1.Length); break; } } TcpClient client2 = server.AcceptTcpClient(); NetworkStream stream2 = client2.GetStream(); //nadanie identyfikatora klientowi 2 while ((i = stream2.Read(bytes2, 0, bytes2.Length)) != 0) { komunikat2.ustaw(bytes2); if (komunikat2.GetOp() == "000001") { Console.WriteLine("Klient pierwszy polaczony! Nadano identyfikator " + Convert.ToInt32(id2, 2)); komunikat2.SetOp("000010"); komunikat2.SetId(id2); komunikat2.GetBitArray().CopyTo(bytes2, 0); stream2.Write(bytes2, 0, bytes2.Length); break; } } //odzczyt liczby przeslanej przez 1 while ((i = stream1.Read(bytes1, 0, bytes1.Length)) != 0) { komunikat1.ustaw(bytes1); if (komunikat1.GetOp() == "000011") { L1 = Convert.ToInt32(komunikat1.GetLiczba(), 2); Console.WriteLine(komunikat1.GetId() + " przesyla liczbe: " + Convert.ToString(L1), 2); break; } } //odzczyt liczby przeslanej przez 2 while ((i = stream2.Read(bytes2, 0, bytes2.Length)) != 0) { komunikat2.ustaw(bytes2); if (komunikat2.GetOp() == "000011") { L2 = Convert.ToInt32(komunikat2.GetLiczba(), 2); Console.WriteLine(komunikat2.GetId() + " przesyla liczbe: " + Convert.ToString(L2), 2); break; } } //Wyznaczanie przedzialu i wylosowanie liczby int min, max; min = L1 - L2; if (min < 0) { min = 0; } max = L1 + L2; if (max > 200) { max = 200; } Random random = new Random(); int zgadywana = random.Next(min, max); Console.WriteLine("Wylosowano przedzial: <" + min + "," + max + ">\nZgadywna liczba to: " + zgadywana); //przeslanie przedzialu klientowi 1 { //min komunikat1.Resetuj(); komunikat1.SetOp("000100"); //komunikat1.SetId(id1); komunikat1.SetLiczba(Convert.ToString(min, 2).PadLeft(8, '0')); komunikat1.GetBitArray().CopyTo(bytes1, 0); stream1.Write(bytes1, 0, bytes1.Length); //max komunikat1.Resetuj(); komunikat1.SetOp("000101"); //komunikat1.SetId(id1); komunikat1.SetLiczba(Convert.ToString(max, 2).PadLeft(8, '0')); komunikat1.GetBitArray().CopyTo(bytes1, 0); stream1.Write(bytes1, 0, bytes1.Length); } //przeslanie przedzialu 2 { //min komunikat2.Resetuj(); komunikat2.SetOp("000100"); //komunikat2.SetId(id2); komunikat2.SetLiczba(Convert.ToString(min, 2).PadLeft(8, '0')); komunikat2.GetBitArray().CopyTo(bytes2, 0); stream2.Write(bytes2, 0, bytes2.Length); //max komunikat2.Resetuj(); komunikat2.SetOp("000101"); //komunikat2.SetId(id2); komunikat2.SetLiczba(Convert.ToString(max, 2).PadLeft(8, '0')); komunikat2.GetBitArray().CopyTo(bytes2, 0); stream2.Write(bytes2, 0, bytes2.Length); } while (true) { while ((i = stream1.Read(bytes1, 0, bytes1.Length)) != 0) { komunikat1.ustaw(bytes1); if (komunikat1.GetOp() == "000110") { //klient przesyla zgadywan liczbe if (Convert.ToInt32(komunikat1.GetLiczba(), 2) == zgadywana) { wygrana1 = true; } else if (Convert.ToInt32(komunikat1.GetLiczba(), 2) > zgadywana) { komunikat1.Resetuj(); komunikat1.SetOp("000111"); //odpowiedz serwera //komunikat1.SetId(id1); komunikat1.SetOdp("010"); //za duza komunikat1.GetBitArray().CopyTo(bytes1, 0); stream1.Write(bytes1, 0, bytes1.Length); } else if (Convert.ToInt32(komunikat1.GetLiczba(), 2) < zgadywana) { komunikat1.Resetuj(); komunikat1.SetOp("000111"); //komunikat1.SetId(id1); komunikat1.SetOdp("011");//za mala komunikat1.GetBitArray().CopyTo(bytes1, 0); stream1.Write(bytes1, 0, bytes1.Length); } break; } } while ((i = stream2.Read(bytes2, 0, bytes2.Length)) != 0) { komunikat2.ustaw(bytes2); if (komunikat2.GetOp() == "000110") { //klient przesyla zgadywan liczbe if (Convert.ToInt32(komunikat2.GetLiczba(), 2) == zgadywana) { wygrana2 = true; } else if (Convert.ToInt32(komunikat2.GetLiczba(), 2) > zgadywana) { komunikat2.Resetuj(); komunikat2.SetOp("000111"); //odpowiedz serwera //komunikat2.SetId(id2); komunikat2.SetOdp("010"); //za duza komunikat2.GetBitArray().CopyTo(bytes2, 0); stream2.Write(bytes2, 0, bytes2.Length); } else if (Convert.ToInt32(komunikat2.GetLiczba(), 2) < zgadywana) { komunikat2.Resetuj(); komunikat2.SetOp("000111"); //komunikat2.SetId(id2); komunikat2.SetOdp("011");//za mala komunikat2.GetBitArray().CopyTo(bytes2, 0); stream2.Write(bytes2, 0, bytes2.Length); } break; } } if (wygrana1 && wygrana2) { komunikat1.Resetuj(); komunikat2.Resetuj(); komunikat1.SetOp("000111"); //odpowiedz serwera //komunikat1.SetId(id1); komunikat1.SetOdp("101"); //remis komunikat1.GetBitArray().CopyTo(bytes1, 0); stream1.Write(bytes1, 0, bytes1.Length); komunikat2.SetOp("000111"); //komunikat2.SetId(id2); komunikat2.SetOdp("101");//remis komunikat2.GetBitArray().CopyTo(bytes2, 0); stream2.Write(bytes2, 0, bytes2.Length); break; } if (wygrana1) { komunikat1.Resetuj(); komunikat2.Resetuj(); komunikat1.SetOp("000111"); //odpowiedz serwera //komunikat1.SetId(id1); komunikat1.SetOdp("001"); //wygrana komunikat1.GetBitArray().CopyTo(bytes1, 0); stream1.Write(bytes1, 0, bytes1.Length); komunikat2.SetOp("000111"); //komunikat2.SetId(id2); komunikat2.SetOdp("100");//przegrana komunikat2.GetBitArray().CopyTo(bytes2, 0); stream2.Write(bytes2, 0, bytes2.Length); break; } if (wygrana2) { komunikat1.Resetuj(); komunikat2.Resetuj(); komunikat1.SetOp("000111"); //odpowiedz serwera //komunikat1.SetId(id1); komunikat1.SetOdp("100"); //przegrana komunikat1.GetBitArray().CopyTo(bytes1, 0); stream1.Write(bytes1, 0, bytes1.Length); komunikat2.SetOp("000111"); //komunikat2.SetId(id2); komunikat2.SetOdp("001");//wygrana komunikat2.GetBitArray().CopyTo(bytes2, 0); stream2.Write(bytes2, 0, bytes2.Length); break; } } } } catch (SocketException e) { Console.WriteLine("SocketException: {0}", e); } finally { Console.WriteLine("\nNacisnij enter aby wyjsc..."); Console.Read(); server.Stop(); } }
public void Start(ref UdpClient udpServer) { //1 Byte[] receiveBytes = udpServer.Receive(ref Client1); komunikat.Ustaw(receiveBytes); //ACK komunikat.Clear(); komunikat.SetOp("ACK"); Byte[] sendBytes = Encoding.ASCII.GetBytes(komunikat.GetMsg()); udpServer.Send(sendBytes, sendBytes.Length, Client1); //Nadanie ID komunikat.Clear(); komunikat.SetOp("ID"); komunikat.SetId(Id1); sendBytes = Encoding.ASCII.GetBytes(komunikat.GetMsg()); udpServer.Send(sendBytes, sendBytes.Length, Client1); //Odebranie ACK receiveBytes = udpServer.Receive(ref reciveEndPoint); komunikat.Ustaw(receiveBytes); //2 receiveBytes = udpServer.Receive(ref Client2); komunikat.Ustaw(receiveBytes); //ACK komunikat.Clear(); komunikat.SetOp("ACK"); sendBytes = Encoding.ASCII.GetBytes(komunikat.GetMsg()); udpServer.Send(sendBytes, sendBytes.Length, Client2); //ID komunikat.Clear(); komunikat.SetOp("ID"); komunikat.SetId(Id2); sendBytes = Encoding.ASCII.GetBytes(komunikat.GetMsg()); udpServer.Send(sendBytes, sendBytes.Length, Client2); //Odebranie ACK receiveBytes = udpServer.Receive(ref reciveEndPoint); komunikat.Ustaw(receiveBytes); //odebranie przdzialu for (int i = 0; i < 2; i++) { komunikat.Ustaw(udpServer.Receive(ref reciveEndPoint)); if (reciveEndPoint.Address.ToString() == Client1.Address.ToString() && reciveEndPoint.Port == Client1.Port && komunikat.GetId() == Id1) { l1 = Convert.ToInt32(komunikat.GetLiczba()); Console.WriteLine("L1 = " + l1); komunikat.Clear(); komunikat.SetOp("ACK"); sendBytes = Encoding.ASCII.GetBytes(komunikat.GetMsg()); udpServer.Send(sendBytes, sendBytes.Length, Client1); } else if (reciveEndPoint.Address.ToString() == Client2.Address.ToString() && reciveEndPoint.Port == Client2.Port && komunikat.GetId() == Id2) { l2 = Convert.ToInt32(komunikat.GetLiczba()); Console.WriteLine("L2 = " + l2); komunikat.Clear(); komunikat.SetOp("ACK"); sendBytes = Encoding.ASCII.GetBytes(komunikat.GetMsg()); udpServer.Send(sendBytes, sendBytes.Length, Client2); } } int liczba_prob = (l1 + l2) / 2; Console.WriteLine("Liczba prob " + liczba_prob); //Wylosowanie liczby int min, max; min = l1 - l2; max = l1 + l2; Random random = new Random(); zgadywana = random.Next(min, max); Console.WriteLine("Zgadywna liczba to: " + zgadywana); //Wyslanie liczby prob komunikat.Clear(); komunikat.SetOp("PrzeslanieProb"); komunikat.SetLiczba(liczba_prob.ToString()); sendBytes = Encoding.ASCII.GetBytes(komunikat.GetMsg()); udpServer.Send(sendBytes, sendBytes.Length, Client1); //Odebranie ACK receiveBytes = udpServer.Receive(ref reciveEndPoint); komunikat.Ustaw(receiveBytes); //Wyslanie liczby prob komunikat.Clear(); komunikat.SetOp("PrzeslanieProb"); komunikat.SetLiczba(liczba_prob.ToString()); sendBytes = Encoding.ASCII.GetBytes(komunikat.GetMsg()); udpServer.Send(sendBytes, sendBytes.Length, Client2); //Odebranie ACK receiveBytes = udpServer.Receive(ref reciveEndPoint); komunikat.Ustaw(receiveBytes); }