NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
BlackReer
Člen
Avatar
BlackReer:28.10.2016 21:39

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.10.2016 21:39
Avatar
Odpovídá na BlackReer
Michal Štěpánek:29.10.2016 9:16

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.10.2016 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:29.10.2016 9:59

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.10.2016 9:59
Avatar
Odpovídá na BlackReer
Michal Štěpánek:29.10.2016 10:46

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.10.2016 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:29.10.2016 11:52

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.10.2016 11:52
Avatar
Odpovídá na BlackReer
Michal Štěpánek:29.10.2016 12:06

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.10.2016 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:29.10.2016 12:15

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

 
Nahoru Odpovědět
29.10.2016 12:15
Avatar
pocitac770
Tvůrce
Avatar
pocitac770:30.10.2016 1:44

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.10.2016 1:44
Avatar
pocitac770
Tvůrce
Avatar
Odpovídá na BlackReer
pocitac770:30.10.2016 1:53

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.10.2016 1:55
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
30.10.2016 1:53
Avatar
BlackReer
Člen
Avatar
Odpovídá na pocitac770
BlackReer:30.10.2016 18:00

Lol ďakujem :D funguje to

 
Nahoru Odpovědět
30.10.2016 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.