Avatar billede mysitesolution Nybegynder
03. august 2005 - 13:56 Der er 15 kommentarer og
1 løsning

Socket i C#

Hej...

Sidder med koden nedenfor, og mangler lidt på den. Det var et eksempel jeg fandt på sockets, men hhm, mangler lidt ting på den... Når jeg connecter på den, smider den mig af igen, når den har skrevet til mig. Jeg vil have at den opretholder forbindelsen, og man kan sende forskellige ting. En anden ting er så, at 2 ikke må forbinde på samme tid. Nogen der kan hjælpe?

using System;
using System.Net.Sockets;
using System.Text;

public class Class1
{

    private const int portNum = 46352;

    public static int Main(String[] args)
    {
        bool done = false;
   
        TcpListener listener = new TcpListener(portNum);

        listener.Start();

        while (!done)
        {
            Console.Write("Waiting for connection...");
            TcpClient client = listener.AcceptTcpClient();
     
            Console.WriteLine("Connection accepted.");
            NetworkStream ns = client.GetStream();

            byte[] byteStatus = Encoding.ASCII.GetBytes("100");

            try
            {
                ns.Write(byteStatus, 0, byteStatus.Length);
                ns.Close();
                client.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }

        listener.Stop();

        return 0;
    }
 
}
Avatar billede arne_v Ekspert
03. august 2005 - 14:01 #1
du kalder

client.Close();

og så bliver client smidt af.

Hvis du vil understøtte flere samtidige klienter så er det nemmeste nok at gå
igang med nogle tråde.
Avatar billede arne_v Ekspert
03. august 2005 - 14:03 #2
http://www.eksperten.dk/artikler/515

handler egentligt om noget andet (nemlig Java og .NET programmer i hver
sin ende af socket), men der er faktisk en masse brugbare eksempler !
Avatar billede mysitesolution Nybegynder
03. august 2005 - 14:03 #3
jep, har prøvet at slette client.Close(); men ved så ikke hvordan jeg får den til at modtage commandoer fra client...

Vil ikke have flere samtidige klienter, vil have så kun én kan connecte ad gangen, men skal vel stadig ahve gang i tråde for at gøre mit program stabilt? Skal lige siges at i fremtiden vil det ikke være et konsol program
Avatar billede arne_v Ekspert
03. august 2005 - 14:07 #4
Hvis kun en kan forbinde ad gangen behøver du ikke lave en tråd per klient.

Men hvis det er en GUI app skal du dog stadig lave en tråd til det her.

Du kan både læse fra og skrive til en socket stream. Husk dog at have en klar
protokol så client og server ikke venter på hinanden.
Avatar billede mysitesolution Nybegynder
03. august 2005 - 14:10 #5
Har skam både lavet et billedformat, og en protokol :) har efterhånden læst lang tid i en bog om billeder, og komprimering :D... hhm... har programmeret i delphi, og der er sådan nogle ting SÅ meget lettere, men alt skal jo heller ikke være let hehe...

Har kigget lidt på koden i den artikle, han laver en tråd til klienten, MEN han afslutter den til sidst også, istedet for at afslutte den, kan man så starte tråden forfra eller sådan noget?
Avatar billede mysitesolution Nybegynder
03. august 2005 - 14:17 #6
er den første C# Server jeg kigger på
Avatar billede arne_v Ekspert
03. august 2005 - 14:20 #7
hvis nu protokollen f.eks. hedder at client sender en linie og at serveren
svarer med en linie indtil client sender "BYE"

så laver du en løkke der læser requests fra client og sender respons tilbage
indtil client sender "BYE"
Avatar billede mysitesolution Nybegynder
03. august 2005 - 14:26 #8
Okay, men kan du ikke vise mig det lidt simpelt... :/ Så finder jeg selv ud af det med tråd, det mener jeg, at jeg har nogenlunde styr på...

Hhm forresten, er du ikke en som har programmeret mange sprog? Må jeg så spørger dig, hvad du synes er bedst af Java, C#, C++? Personligt synes jeg C# er det bedste som sprog, men ikke til anvendelighed... Her tænker jeg på, at det ikke rigtig er understøttet på andre platforme, andet end Mono :/ Java er jo fuldt understøttet, og C++ også, dog ting der skal ændres, fra platform til platform
Avatar billede arne_v Ekspert
03. august 2005 - 14:38 #9
skitse:

StreamReader rdr = new StreamReader(cli.GetStream());
StreamWriter wrt = new StreamWriter(cli.GetStream();
bool done = false;
while(!done)
{
    string line = rdr.ReadLine();
    if(cmd == "BYE")
    {
        done = true;
    }
    else
    {
          wrt.WriteLine("Reply to " + line);
    }
}
Avatar billede arne_v Ekspert
03. august 2005 - 14:40 #10
Jeg programmerer både i Java, C# og C++.

Det er sjældent at man har et valg når et system skal udvikles i den virkelige verden.

Jeg er nok mest glad for Java.

Omend C# har nogle features i selve sproget som jeg godt kan lide.
Avatar billede mysitesolution Nybegynder
03. august 2005 - 14:48 #11
hhm okay prøver at bikse noget sammen ;)

Hhm... personligt synes jeg C++ er alt for sammenbikset, alt for meget, alt for besværligt. Java, coolt sprog, men synes godt de kunne tage sig sammen med deres GUI hhm, men vel det mindste problem...Og Microsoft, lav dog for filan et MacOs namespace, og en compiler + framework til mac :)
Avatar billede mysitesolution Nybegynder
03. august 2005 - 15:00 #12
using System;
using System.Net;
using System.IO;
using System.Net.Sockets;
using System.Text;

public class Class1
{

    private const int portNum = 46352;

    public static int Main(String[] args)
    {
        bool done = false;
        bool cDone = false;
   
        TcpListener listener = new TcpListener(portNum);

        listener.Start();

        while (!done)
        {
            Console.Write("Waiting for connection...");
            TcpClient client = listener.AcceptTcpClient();
     
            Console.WriteLine("Connection accepted.");
            //NetworkStream ns = client.GetStream();

            StreamReader nReader = new StreamReader(client.GetStream());
            StreamWriter nWriter = new StreamWriter(client.GetStream());

            while (!cDone)
            {
                string command = nReader.ReadLine();

                switch(command)
                {
                    case "1":
                        Console.WriteLine("Command received");
                        break;

                    case "2":
                        Console.WriteLine("Closing...");
                        cDone = true;
                        break;
                }
            }

            nReader.Close();
            nWriter.Close();
            client.Close();
        }

        listener.Stop();

        return 0;
    }
 
}

Sådan :), nogen indvendinger til det? Andet end der self. skal nogen exceptions på
Avatar billede mysitesolution Nybegynder
03. august 2005 - 15:04 #13
har egentlig selv en... hhm, hvis jeg åbner 2 telnets, og connecter den ene... Derefter connecter jeg den anden, så når jeg afbryder den første, så logger den anden ind, og afbryder med det samme hhm...

det værste er så, at jeg ikke kan se hvad telnet skriver, da tegnene i den, fucker :/
Avatar billede arne_v Ekspert
03. august 2005 - 16:33 #14
du skal nok sætte

cDone = false;

efter Accept !
Avatar billede mysitesolution Nybegynder
03. august 2005 - 18:17 #15
kay tak... medhensyn til det problem jeg havde med 2 klienter, har jeg besluttet mig for at lave alt i tråde, så serveren fortæller klient 2,3,4 at pladsen er optaget...

takker for hjælpen... fyr et svar ind :)
Avatar billede arne_v Ekspert
03. august 2005 - 18:25 #16
kommer her
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester