TCP + Mysql

TCP + Mysql
2018-12-16T09:12:14+01:00
2018-12-16T18:30:38+01:00
2022-10-15T21:41:04+02:00
SikrZ
Sziasztok!

Adott egy TCP szerver + egy kliens alkalmazás.
A szerver több klienst is ki tud szolgálni, Ez mind szép és jó.
Régen már csak csináltam ilyet de azt ADODB-vel tehát a szerver adott adatokkal amiket a kliens küld
tudtam adatbázis műveleteket elvégezni. 
Most viszont sima MySQL -szerettem volna beüzemelni a szerverre. Csupán annyi a gondom , hogy bármit próbálok csinálni adatfeltöltés módosítást bármit a szerver kilövi magát. 
Tehát induláskor a mysql.open() az okés kapcsolódik 0 hibával.  viszont amint műveletet hajtanék végre hiba üzenet nélkül vissza dobja hogy a kapcsolat megszakadt az adott klienssel. (nem hiba üzenet)
Próbáltam új Thread-ban futtatni a mysql kapcsolatot de nem sikerült megoldani a problémám.
Szóval nem tudom hogyan tudnám ezt megoldani. 

Válaszokat és ötletetek előre is megköszönöm :D
Mutasd a teljes hozzászólást!
No most kellene két-három külön kipróbálóprogramot csinálni MySql-hez, szerver-kliens architektúra nélkül, de nagyon ügyelve a hibakezelésre: minden választ ellenőrizni, minden exception elkapni, stb.
Mutasd a teljes hozzászólást!

  • > viszont amint műveletet hajtanék végre hiba üzenet nélkül vissza dobja hogy a kapcsolat megszakadt az adott klienssel. (nem hiba üzenet)

    Hanem micsoda, ha nem hibaüzenet? És mi akadályoz abban, hogy beidézd? A releváns programrészekkel együtt?
    És milyen 'kliens'? A te programodhoz TCP-n kapcsolódó kliens, vagy a te programodból a MySql-szerverre nyitott kliens-kapcsolat?
    Mutasd a teljes hozzászólást!
  • Üdv! 

    class Clients { public int connectionID; public string ip; public TcpClient socket; public NetworkStream myStream; private byte[] readBuffer; public ByteBuffer Buffer; public string MACHINEID; public void Start() { socket.SendBufferSize = 4096; socket.ReceiveBufferSize = 4096; myStream = socket.GetStream(); readBuffer = new byte[4096]; myStream.BeginRead(readBuffer,0,socket.ReceiveBufferSize,ReceivedDataCallback,null); } private void ReceivedDataCallback(IAsyncResult result) { try { int readbytes = myStream.EndRead(result); if (readbytes <= 0) { CloseConnection(); return; } byte[] newBytes = new byte[readbytes]; System.Buffer.BlockCopy(readBuffer, 0, newBytes, 0, readbytes); SzerverHandleData.HandleData(connectionID, newBytes); myStream.BeginRead(readBuffer, 0, socket.ReceiveBufferSize, ReceivedDataCallback, null); } catch (Exception ex) { CloseConnection(); //Console.WriteLine(ex.ToString()); } } private void ReceivedDataCallback(IAsyncResult result) { try { int readbytes = myStream.EndRead(result); if (readbytes <= 0) { CloseConnection(); return; } byte[] newBytes = new byte[readbytes]; System.Buffer.BlockCopy(readBuffer, 0, newBytes, 0, readbytes); SzerverHandleData.HandleData(connectionID, newBytes); myStream.BeginRead(readBuffer, 0, socket.ReceiveBufferSize, ReceivedDataCallback, null); } catch (Exception ex) { CloseConnection(); //Console.WriteLine(ex.ToString()); } Ez a függvény hívódik meg a szerveren amikor meghívom a mysql feltöltő fügvényt. Ez az ami nem kimondottan hiba üzenet csak , hogy a szerver eldobta a kapcsolatot. Az adott kliensel. A programról pedig, hogy van egy szerver oldal + az alkalmazás a usereknél , amit ha elindít egyből küld egy azonosító csomagot. A kommunikációt az működik több klienst is kiszolgál. a mysql class: class MySQL { private MySqlConnection connection; private string server; private string database; private string uid; private string password; public void ConnectToMySQL() { Initialize(); } private void Initialize() { server = "localhost"; database = "Teszt_database"; uid = "root"; password = ""; string connectionString; connectionString = "SERVER="+server+";"+"DATABASE="+database+";"+"UID="+uid+";"+"PASSWORD="+password+";"; connection = new MySqlConnection(connectionString); Console.WriteLine("Mysql kapcsolat létrejött!"); } public bool OpenConnection() { try { connection.Open(); return true; } catch (MySqlException ex) { switch (ex.Number) { case 0: Console.WriteLine("Jogtalan belépési próbálkozás!"); break; case 1045: Console.WriteLine("Adatbázis nem található!"); break; case 1042: Console.WriteLine("Adatbázis szerver nem elérhető!"); break; } return false; } } public bool CloseConnection() { try { connection.Close(); return true; } catch (MySqlException ex) { Console.WriteLine(ex); return false; } } //MŰVELETEK// public void Insert(string email,string name) { string query = "INSERT INTO Fizeto_Felhasznalok ('Email_ID','Name') VALUE('" + email + "','" + name + "')"; if (OpenConnection() == true) { try { MySqlCommand cmd = new MySqlCommand(query, connection); cmd.ExecuteNonQuery(); CloseConnection(); Console.WriteLine("Adatbázis feltöltés sikerült!"); } catch (Exception ex) { Console.WriteLine(ex); } } } } Másik classban csak ennyit írok. privat static MySQL mysql = new MySQL(); és meghívom a insertet mysql.Insert("asd","asd"); példáult és amikor ezt meghívom eldobja az adott klienssel a kapcsolatot. A kliens pedig egy másik osztály amit az elején bemásoltam.
    Mutasd a teljes hozzászólást!
  • Akkor most hol van a nemhibaüzenet? Mit jelent pontosan az
    eldobja az adott klienssel a kapcsolatot'?
    Mutasd a teljes hozzászólást!
  • private void CloseConnection() { Console.WriteLine("Megszakadt a kapcsolat vele : {0} ",ip); socket.Close(); socket = null; } Ez van még a Client class alján csak lemaradt mert ezt hívja meg ugye a private void ReceivedDataCallback(IAsyncResult result) a catchban.
    Mutasd a teljes hozzászólást!
  • Szerintem belezavarodtál az aszinkron műveletekbe és a callback-ekbe. Simán readBytes-szal olvassál, mindig annyit, amennyit éppen lehet. Minden olvasás után ellenőrizd, hogy volt-e hiba, volt-e EOF, összeállt-e egy teljes üzenet (ezt neked kell tudnod, hogy mit tekintesz üzenetnek, a TCP-ben csak bájtfolyam van.)
    Mutasd a teljes hozzászólást!
  • Ehhez van egy dll. ami a küldésnél is és olvasásnál is össze állítja illetve kicsomagolja az adott típusokra és vissza adja string int char stb a bytokat..
    Nem hiszem hogy ezzel bármi gond is lenne mert a mysql kapcsolat nélkül az egész tökéletesen működik.
    Valami a mysql lekérdezéssel kapcsolattal nem stimmel , hogy miért szakítja  meg az adott kapcsolatot. Tehát az említett mysql class nélkül (call insert) a tcp kapcsolat tökéletesen működik több kliensel is. 
    Az insert meg akkor van meghívva amikor a kliens küld egy csomagot és abból kiolvasott string name és email után  függvény végén hívódik meg.

     Nem jutok vele semerre már pár napja :C
    Mutasd a teljes hozzászólást!
  • Azt gondolnám, hogy akarmiféle probléma (exception) van (például a MySql-ben), te magad hívod meg az Exception-kezelőből a CloseConnection-t.
    Mutasd a teljes hozzászólást!
  • nem igazán lettem előrébb hogy ha kiveszem a closeconnection, hogy ne zárja be is eldobja a szerver a klienst és kapok egy nullreference exceptont amire jelenleg semmire nem jutok :'d 

    Én csak arra tippelek , hogy valamit szarul csinálok értem ezalatt. hogy nem vagyok szakmabeli csak hobbi és elmaradnak a lényeges static privat témák mély ismerete. Így szerintem ilyen téren lesz a hiba, hogy nem éri el vagy nem tudja rendesen kezelni  vagy pasz egyszerűn nem jutok sehova :D

    igazából ez a videó sorozat a szever meg a kliens meg a dll.
    YouTube

    ezt a mysql szerettem volna működésre bírni.
    YouTube

    és ezt már egyszer csináltam akkor ezzel az ADODB vel és azzal ment a történet. Tehát nem értem a sima mysql -el miért nem megy.
    YouTube

    Köszi a segítséget amúgy.
    Mutasd a teljes hozzászólást!
  • No most kellene két-három külön kipróbálóprogramot csinálni MySql-hez, szerver-kliens architektúra nélkül, de nagyon ügyelve a hibakezelésre: minden választ ellenőrizni, minden exception elkapni, stb.
    Mutasd a teljes hozzászólást!
  • Kicsit olajozottabb lenne a történet, ha szétválogatnád. Mondjuk 1 topik 1 probléma, és nem egy egész probléma fürt.

    Ha láttál youtube-on valamit, ami egészében nem működött, azt írd meg srácnak YT-n.

    Ha az alkalmazás logikába zavarodsz bele, gyakorold egy kicsit, és majd leszel benne jobb is. Vannak nagyon jó könyvek is a témában. Ha kéred, javaslunk párat.

    Ha a mysql-el van problémád, írd bele a program logikát egy darab statikus main() függvénybe sorfolytonos, szinkron végrehajtással. Maximum 30 sor. Abban majd tényleg lehet hibát keresni.
    Mutasd a teljes hozzászólást!
  • Sikerült megoldanom!
    Igazából nem teljesen értem mint jelent az instance. Csak mert az oldotta meg, hogy
    csináltam egy Global class-t

    aztán azt public Global instance = new Global();
    igazából ezt pontosan nem tudom mit csinál.

    public static MySQL mysql = new MySQL();
     aztán még felsoroltam a többi osztályt, hogy más osztályból is elérjem és ezen keresztül érem el az összes függvényt.

    Global.mysql.... így meghívva az , hogy Global.mysql.insert(email,nev); tökéletes lefutott az egész. 
    Most pedig utána nézek mi is pontosan ez instance, vagyis mi történt pontosan. 
    Ha ehhez van valami leírást vagy kisokos mi is történt valójában megköszönöm!
    + Köszi a segítséget.
    Mutasd a teljes hozzászólást!
  • Instance=példány. A class az csak egy recept, amit a példány létrehozásával alakítasz ténylegesen fogyasztható étellé, ezt csinálja a "new Valami()"
    Persze hogy ne legyen ilyen egyszerű, léteznek a static dolgok, amik mindig elérhetőek, az osztály nevén át ("Valami.statikusizé=42" kontra "instance.nemstatikusizé=28").
    A public-private az láthatóság, a publikust mindenki látja, a privátot meg csak kevesen).
    Mutasd a teljes hozzászólást!
  • Szia!

    Nem lehet hogy az a hiba, hogy a SQL insert-ben value van valueS helyett ?

    string query = "INSERT INTO Fizeto_Felhasznalok ('Email_ID','Name') VALUE('" + email + "','" + name + "')";


    Mutasd a teljes hozzászólást!
  • Hali!

    Nem lehet hogy az a hiba, hogy a SQL insert-ben value van valueS helyett ?

    Nem. Mindkét változat „legális”.

    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd