Avatar
BlackReer
Člen
Avatar
BlackReer:

Chcel by som sa spýtať či by mi niekto nepomohol ako spojazdniť server aby dokázal prijať viac správ ako iba tu prvú.
Môj problém je že keď odošlem správu z klienta tak prvá dôjde a normálne sa zobrazí na servery v konzoli, drúha správa už nedôjde lebo sa klient nedokáže pripojiť.
Kód serveru :

class Program
{
    static byte[] data;
    static Socket socket;
    static void Main(string[] args)
    {
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        socket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 80));
        socket.Listen(1);
        while (true)
        {
            Socket acceptdata = socket.Accept();
            data = new byte[acceptdata.SendBufferSize];
            int j = acceptdata.Receive(data);
            byte[] adata = new byte[j];
            for (int i = 0; i < j; i++)
                adata[i] = data[i];
            string dat = Encoding.Unicode.GetString(adata);
            Console.WriteLine(dat);
        }
    }
}

Kód klienta:

class Program
{
    static Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    static void Main(string[] args)
    {
        while (true)
        {
            Console.WriteLine("Prípájam!....");
            try
            {
                s.Connect(IPAddress.Parse("127.0.0.1"), 80);
                Console.WriteLine("Pripojene!");
            }
            catch
            {
                Console.WriteLine("Nepodarilo sa pripojiť");
            }
            Console.WriteLine("Vložte text čo chcete poslať!:");
            string dataP = Console.ReadLine();
            try
            {
                byte[] data = Encoding.Unicode.GetBytes(dataP);
                s.Send(data);
                Console.WriteLine("Odoslané");
                Console.WriteLine("-------------------");
                Console.WriteLine("-------------------");
                Console.WriteLine("-------------------");
            }
            catch
            {
                Console.WriteLine("Niekde nastala chyba!");
            }
        }
    }
}
 
Odpovědět 28. října 21:39
Avatar
Odpovídá na BlackReer
Michal Štěpánek:

Nemůže to být tím, že už je připojený (po té první zprávě) a pokouší se připojit podruhé? Nikde nevidím, že by se po odeslání zprávy odpojil...

Nahoru Odpovědět 29. října 9:16
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
BlackReer
Člen
Avatar
Odpovídá na Michal Štěpánek
BlackReer:

Ja si myslím že chyba je skôr v servery, lebo keď sa klient chce druhý krát pripojiť a nepodarí sa mu to(logicky ked už pripojený je) tak vyhodí hlášku "Nepodarilo sa pripojiť" a pokračuje dalej na odosielanie textu počas toho ako je stále pripojený.

 
Nahoru Odpovědět 29. října 9:59
Avatar
Odpovídá na BlackReer
Michal Štěpánek:

To je právě to, co si nemyslím, protože máš pokus o připojení v try-catch bloku, vyhodí výjimku a dál nepokračuje...

Nahoru Odpovědět 29. října 10:46
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
BlackReer
Člen
Avatar
Odpovídá na Michal Štěpánek
BlackReer:

Neviem no. Keď som to mal urobené v Win Forms kde som mal tlačitko zvlášť na pripojenie a zvlášť na odosielanie textu z textboxu tak sa to chovalo rovnako. Na začiatku som kliknul pripojiť, išlo fajn. Potom som napísal text a poslal, tiež išlo. Znova som napísal text a dal poslať no správa už nedošla/neodišla. S gui som mal tento základ klient-server rovnaký.

 
Nahoru Odpovědět 29. října 11:52
Avatar
Odpovídá na BlackReer
Michal Štěpánek:

zkus to spojení prostě uzavřít

class Program
{
    static Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    static void Main(string[] args)
    {
        while (true)
        {
            Console.WriteLine("Prípájam!....");
            try
            {
                s.Connect(IPAddress.Parse("127.0.0.1"), 80);
                Console.WriteLine("Pripojene!");
            }
            catch
            {
                Console.WriteLine("Nepodarilo sa pripojiť");
            }
            Console.WriteLine("Vložte text čo chcete poslať!:");
            string dataP = Console.ReadLine();
            try
            {
                byte[] data = Encoding.Unicode.GetBytes(dataP);
                s.Send(data);
                Console.WriteLine("Odoslané");
                Console.WriteLine("-------------------");
                Console.WriteLine("-------------------");
                Console.WriteLine("-------------------");
            }
            catch
            {
                Console.WriteLine("Niekde nastala chyba!");
            }
            finally
            {
                //zavřít spojení se serverem
            }
        }
    }
}
Nahoru Odpovědět 29. října 12:06
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
BlackReer
Člen
Avatar
Odpovídá na Michal Štěpánek
BlackReer:

Ok dik, keď budem doma tak to skúsim či to bude fungovať.

 
Nahoru Odpovědět 29. října 12:15
Avatar
pocitac770
Redaktor
Avatar
pocitac770:

Mě osobně připadâ zvláštní se u TCP komunikace pořád odpojovat a připojovat... Co takhle prostě posunout while cyklus, aby se to jednou připojilo a opakovalo se jenom načtení + odeslání zpráv?

 
Nahoru Odpovědět 30. října 1:44
Avatar
pocitac770
Redaktor
Avatar
Odpovídá na BlackReer
pocitac770:

A vidím i chybu na serveru (a to jsem na do C# TCPčka jenom nahlídnul, abych viděl, jak by bylo těžký udělat spyware :D)

socket.Listen(1);
while (true)
{
    Socket acceptdata = socket.Accept();

Ty řekneš serveru, že má pustit k sobě jenom jednoho klienta, ale snažíš se ho několikrát připojit-odeslat/přijmout zprávu-odpojit a celé dokola. Jistě, že ti to nefunguje, protože při dalším pokusu o připojení ti server "dalšího" klienta již odmítne. (Viz tip, co jsem napsal výše). Pokud říkám bláboly, tak mě opravte, v C# teprv začínám. (+ jsou 2 hodiny v noci :D )

Editováno 30. října 1:55
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 30. října 1:53
Avatar
BlackReer
Člen
Avatar
Odpovídá na pocitac770
BlackReer:

Lol ďakujem :D funguje to

 
Nahoru Odpovědět 30. října 18:00
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.