// halutaan käynnistää alkuun tätä classia käynnistäessä public void Main(string nickName, string ip, string port, ClientForm form) { // merkkaa käyttöliittymän polun muuttujaan cForm = form; // socketin säädöt master = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(ip), Int32.Parse(port)); name = nickName; // yritetään liittyä halutulle serverille try { master.Connect(ipe); cForm.WriteMessage("Connected to the server!"); // käynnistetään uusi threadi ottamaan dataa vastaan Thread t = new Thread(() => { Data_IN(cForm); }); t.Start(); // lähetetään paketti serverille rekisteröimistä varten Packet p = new Packet(PacketType.Registeration, name); master.Send(p.ToBytes()); } // tehdään, mikäli yhteys serveriin ei jostain syystä onnistunut catch (Exception ex) { Console.WriteLine(ex.Message); cForm.WriteMessage("Could not connect to host!"); } }
// ottaa dataa vastaan serveriltä static void Data_IN(ClientForm form) { ClientForm cForm = form; byte[] Buffer; int readBytes; // threadi pitää looppia päällä kokoajan, jotta kaikki data saadaan vastaan. for (;;) { // yrittää ottaa dataa vastaa try { Buffer = new byte[master.SendBufferSize]; readBytes = master.Receive(Buffer); // mikäli dataa on tullut, lähetetään se käsiteltäväksi if (readBytes > 0) { DataManager(new Packet(Buffer), cForm); } } // mikäli mitään dataa ei tule, serveri on todennäköisesti kaatunut, joten ohjelma suljetaan catch (SocketException ex) { Console.WriteLine(ex.Message); cForm.WriteMessage("The server had disconnected!"); Environment.Exit(0); } } }
// käsittelee datan static void DataManager(Packet p, ClientForm form) { ClientForm cForm = form; ClientNetworking cNetworking = new ClientNetworking(); // katsoo millaista dataa käsitellään switch (p.packetType) { case PacketType.Registeration: // tarkista onko kyseessä ensimmäinen käyttäjän // (vaikutta lähinnä itse pelin ajastimen hoitamiseen) id = p.Gdata[0]; if (p.Gdata[1] == "yes") { isFirst = true; cForm.IsFirstCheck(); } else { isFirst = false; } break; case PacketType.Chat: string input = p.Gdata[0] + ": " + p.Gdata[1]; cForm.WriteMessage(input); break; case PacketType.Movement: break; case PacketType.Timer: cForm.TimerTick(cForm); break; default: break; } }