C# Server - Client 2

C# Server - Client 2
2009-04-01T19:51:51+02:00
2009-04-07T13:31:26+02:00
2022-07-31T02:05:32+02:00
Flux
Sziasztok!:)
Hosszas hajtépés után sem igazán jöttem rá, hogy oldható meg, kliens üzenetet küld szervernek, szerver fogadja, szerver üzenetet visszaküldi, kliens fogadja.
Egy darabig, egész pontosan a Split- alkalmazásáig eljutottam, de aztán az üzenetek valahogy nem érkeztek meg a megfelelő helyre. Kérném a mesterek segítségét. Vagy aki otthon van a témában.


using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.Threading; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { //2000-es Port figyelése TcpListener figyel = new TcpListener(System.Net.IPAddress.Any, 2000); figyel.Start(); System.Console.WriteLine("Szerver - figyelés elinditva"); while (true) { //Folyamatossan várjuk a kapcsolatokat. Socket kapcsolat = figyel.AcceptSocket(); Server szerver = new Server(kapcsolat); Thread szal = new Thread(new ThreadStart(szerver.kliens)); szal.Start(); System.Console.WriteLine("Szál elindult"); } } } class Server { private Socket kapcsolat; public Server(Socket s) { kapcsolat = s; } public void kliens() { if (kapcsolat.Connected) // ha kapcsolodik valaki... { System.Console.WriteLine("Kliens érkezett"); UzenetKliens("üzenet a szervertől"); } } public void UzenetKliens(string msguzenet) { try { Byte[] b = Encoding.UTF8.GetBytes(msguzenet.ToCharArray()); kapcsolat.Send(b, b.Length, SocketFlags.None); } catch (Exception ex) { System.Console.WriteLine(ex.Message); } } } } Client: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net.Sockets; namespace Kliens { public partial class Form1 : Form { TcpClient tc = new TcpClient(); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { } public void UzenetSzerver(string msguzenet) { try { tc.Connect("localhost", 2000); NetworkStream kimeno = tc.GetStream(); byte[] msg = Encoding.UTF8.GetBytes(msguzenet); kimeno.Write(msg, 0, msg.Length); kimeno.Flush(); } catch(Exception ex) { MessageBox.Show(ex.Message); } } public void UzenetOlvas(string erkezett) { Byte[] uzenet = new Byte[50]; try { NetworkStream s = tc.GetStream(); s.Read(uzenet, 0, uzenet.Length); szoveg.Text = Encoding.UTF8.GetString(uzenet); tc.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } }

ahogy próbáltam:
kliens az alábbi formában küld adatot: "ADAT#" + uzenet
Szerver, Uzenetolvasban fogadja, és Splittel vizsgálom a # , az adatokat tömbe rakom. Na kb itt el is akadt a dolog. Lefutni lefutott a rész, de tömb elemei üressen maradtak. Ki is szedtem az általam írt részt, mert zagyvaság. Ezért egy "szűz" forrásban kellene nekem a segítség.
Mutasd a teljes hozzászólást!
Futtasd e példát..(WCF Simple Example)

Egy "Hello"-ra kapsz egy "HelloService" választ.
Mutasd a teljes hozzászólást!

  • WCF nem jó?..(WCF (Windows Communication Foundation) Example)
    Kiemelés a link-ről:

    It is said that WCF is very dynamic regarding the transfer methods, and can be configured to use almost any communication standard which makes it suitable for many client/server applications. It does not matter if you use HTTP, TCP etc., to transfer data, and the optional SSL / Encryption makes the WCF even more suited for large scale solutions.
    A progi letölthető, tesztelhető..
    Mutasd a teljes hozzászólást!
  • hm..nem nagyon értem mire gondolsz. Példának, vagy , hogy ez kezelné az üzeneteket? Mint szerver? Ha az utóbbira, akkor nem. Akkor nem jó megoldás, mert idővel a szerver más dolgokat is kell tudjon. Amennyiben példának, bele sasolok, hátha van valami segítségre.
    Mutasd a teljes hozzászólást!
  • Ebbe is kukkanthatsz..(WCF + WF 3.5 - Az egyesített kommunikációs infrastruktúra )

    Más is kereste..(WCF Oda-Vissza kommunikáció)
    Mutasd a teljes hozzászólást!
  • Szia,
    kb sejtettem, hogy félre érthető lesz. Rendben van, kicsit tanulmányoztam a WCF-t, és értem én, hogy ez egy új technológia , meg, hogy képes alkalmazásokkal komunkálni, és kötések alkalmazásával,különféle módszerek valósíthatok meg. Ezt nem is vitatom. Engem az érdekelne, még ,ha WCF alkalmazásával is, vagy akár, ahogy fentebb lévő szerveremben. Az üzenetet küldése, és üzenetek fogadása, hogy valósítható meg? Szóval, hogy kellene neki állni a dolognak, hogy kimenő, és bejövő csatornákon egyaránt tudjak üzenetet küldeni, fogadni. Valami rávezetés, példa kellene nekem erre. Remélem, így már érthető mit szeretnék. (Ezért is írtam, hogy az üzeneteket az alábbi formában küldeném.: ÜZENET# + barmi. Csak, hogy ezt , hogy kell ügyessen klienstől , szervernek küldeni, és szerveren ezt, hogy kell fogadni, és fogadás után, hogy kell üzenetet visszaküldeni. Ez rejtély számomra.) Bocs a rossz kifejezés miatt.
    Mutasd a teljes hozzászólást!
  • (Ezért is írtam, hogy az üzeneteket az alábbi formában küldeném.: ÜZENET# + barmi. Csak, hogy ezt , hogy kell ügyessen klienstől , szervernek küldeni, és szerveren ezt, hogy kell fogadni, és fogadás után, hogy kell üzenetet visszaküldeni. Ez rejtély számomra.)

    Bocsi, de visszakérdezek:
    Mit kell tennie a szervernek az üzenettel, ill. mit küld a szerver a kliensnek?
    Túróczy Attila cikkét olvastad?..(Windows Communication Foundation - Elméleti háttér)
    Ez egy mintaalkalmazáson keresztüli ismertető..(Elosztott rendszerek programozása WCF technológiával)
    Mutasd a teljes hozzászólást!
  • WCF-ről mindent átolvastam, amit link-ként itt találtam illetve a barátunkat is segítségül hívtam. Szerintem , jelen esetben a WCF többet kínál, ami nekem most ide kellene.
    Igazából egyenlőre , tanulás szintjén van a dolog. Szóval nem konkrét dologra készül. Persze később azok is lesznek, egyenlőre értelmezés szinten van a dolog, mi mit csinál és miért. Itt eléggé megállt a tudomány, és semmi használható doksit nem találni már erről. Igazából a cél amit itt megszeretnék valósítani, pl. Kliensen egy szövegmező, és egy gomb. Szövegmezőbe írunk valamit pl : Béla , gomb lenyomására Kliens kiküldi szervernek. Szerver ezt fogadja, és akár el is tárolja. Tárolás után, visszaküldi kliensnek, hogy tárolta a nevet. Ezzel mindent megvalósítanánk, amit eddig szeretnék. Kliens üzit küld, fogad. Szerver üzit küld, fogad.
    Mutasd a teljes hozzászólást!
  • hm...
    Mutasd a teljes hozzászólást!
  • Futtasd e példát..(WCF Simple Example)

    Egy "Hello"-ra kapsz egy "HelloService" választ.
    Mutasd a teljes hozzászólást!
  • Na ok! WCF nélkül, van megoldás a problémámra?:) Csakis WCF alkalmazásával oldható meg, szerver és kliens közötti kommunikáció?
    Mutasd a teljes hozzászólást!
  • NagyTestvér példája..(Consuming a Web Service Sample )
    Bár VB-s, de a lényeget leszűrheted, vagy konvertálhatod..
    Töltsd le, és böngészd át!
    Ez is egy letölthető példa..(Creating a Windows Service in C#)
    Mutasd a teljes hozzászólást!
  • Nem értem. Tán, én nem látom a fától az erdőt, vagy még mindig más úton vagyunk. letöltöttem innen egy WCF szerver, klienst. Tök jó dolog meg minden, egyrészt szerintem sokkal bonyolultabb és nehezebb megérteni. De még mindig nincs tudomásomra adva, hogy tudom én a fentebb megírt szerverem, és kliensem között az üzeneteimet fogadni, és más üzenetet visszaküldeni.
    Mégegyszer nekifutok, és most már jó lenne elvonatkoztatni a WCF szolgáltatásaitól, mert az csak elbonyolítja a helyzetet.
    Az alábbi formában gondoltam:
    Kliens:

    public void UzenetSzerver(string msguzenet) { try { tc.Connect("localhost", 2000); NetworkStream kimeno = tc.GetStream(); byte[] msg = Encoding.UTF8.GetBytes(msguzenet); kimeno.Write(msg, 0, msg.Length); kimeno.Flush(); } catch(Exception ex) { MessageBox.Show(ex.Message); } }

    ebben a program részben elmegy az üzenet szervernek.
    A legnagyobb kérdés.
    Szerencsétlen szerver, hogy fogadja ezt az üzenetet? Ami ennél is fontosabb, hogy adjuk meg neki, hogy mi az az üzenet.
    Ha kliensből igy küldöm az üzenetet:
    NÉV(#<-ez az elválasztó, amiből tudjuk az üzenet tartalmát.) + Geza

    Szervernél valami olyasmira gondolok, hogy amikor ez az üzenet sor megérkezik. A szerver, a beérkező üzenetet szétbontja
    A #(választó elötti szót meglesi), és ha az NÉV, akkor a választó utáni részt pl egy tömbe, vagy List-be rakja. Ha a bejövő üzenet első szava, elválasztó jel előtt, pl: AUTO, akkor mi már tudjuk, hogy ha AUTO üzenet érkezik a szerverhez, akkor majd az elválasztó jel utáni rész, egy kocsi márkáját fogja tartalmazni.

    Ezért probáltam megkőzeliteni, ugy a dolgot, hogy a bérkező üzeneteteket, egy SPLIT- módszerrel szétszedni, és figyelni az elválasztó jelet. Majd elválasztó jel elötti, és jel utáni szavakat külön megnézni, ( Ha NÉV, akkor a hozzá tartozó értékket használni .) stb... Csak mivel, nincs gyakorlatom ebben, és kb csak elméleti szálon tudom elvégezni, kivitelezéshez kellene segítség. Csak , nagyon elvittél a WCF irányába, ami szinte feje tetejére állítja az egészet.
    Remélem, nem én beszélek nagy hülyeségeket, és csak értelmezésileg vannak gondok. Bár azt hiszem ennél jobban már nem tudom, elmondani, mit szeretnék.

    Remélem sikerül megoldást találni a problémára :).
    Köszi a fáradozást
    Mutasd a teljes hozzászólást!
  • Most csak írni tudsz, vagy olvasol is néha?
    Utsi link-emen nincs szó WCF-ről..(Creating a Windows Service in C#)
    Nézd meg miként működik, próbáld alakítani a célodnak megfelelően, és talán kiderül hol a gond az eredeti próbálkozásodnál!
    Mutasd a teljes hozzászólást!
  • Hi!

    Én nem teljesen értem, hogy mi a problémád, az hogy üzenetet küldj/fogadj vagy az hogy a kapott üzenetet feldolgozd.
    Szerintem érdemes azzal kezdened, hogy pl. küldesz üzenetet szervernek és a kapott üzenetet visszaküldöd.
    Aztán ha ezzel megvagy akkor már tudsz az általad kitalált üzenetformában adat#adat1#adat2# vagy akárhogy tömböt vagy bármit küldeni egészen addig míg az adataid nem tartlamaznak # karaktert, és igen erre a split tökéletesen meg is felel.
    Bár már régen foglalkoztam ilyenekkel, de én annó a szerver oldalon a tcplistenert kidobtam külön szálra ami ha sorvéget talált akkor dobott egy eventet hogy "Üzenet érkezett" amit aztán lekezeltem teljesen máshol és csinálta amit csinált az üzenet függvényében.
    Mutasd a teljes hozzászólást!
  • Szia!
    Igen, azzal, hogy szervernek küldök egy üzenet, majd azt vissza, addig nincs is gond. Csak, amikor több üzenetet kell kezelni. A feldolgozással van gondom, hogy ez , hogy is kellene kinézzen. Meg, hogy az üzenetek olvasását, valami eseményhez kell kötni, és egy végtelen ciklusra állítani, az üzenetek fogadását, az se valami jó gondolat. Szóval még mindig keresem a megoldást
    Mutasd a teljes hozzászólást!
  • Ezért írtam, azt a tippet amivel én oldotatm meg, a socket olvasását külön szálon futtatod, amely ha jött valami üzenet akkor dob egy eventet, amit valami listenerrel figyelsz és ott meg feldolgozod az üzenetet adott esetben ha kell válaszolsz rá. Biztos vannak ennél szebb megoldások is nem vagyok vmi nagy programozó ink. csak hobby szinten, de ez egy megoldás ami nálam müködött.
    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