Avatar billede medions Nybegynder
28. juli 2004 - 11:07 Der er 10 kommentarer og
1 løsning

Socket problemer

Hey!

Mit program fryser hver gang jeg vil prøve at udføre nedenstående kode... Jeg har fundet ud af at det er ved denne linje den fryser:
Socket socketForClient = tcpListener.AcceptSocket();

Hvis jeg udkommentere den kommer min windows form fintfint op...

            try {
                IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
               
                TcpListener tcpListener = new TcpListener(ipAddress, 1010);
                tcpListener.Start();
               
                Socket socketForClient = tcpListener.AcceptSocket();
            }
            catch(Exception e)
            {
                MessageBox.Show(e.ToString()) ;
            }

//>Rune
Avatar billede wisen Nybegynder
28. juli 2004 - 11:08 #1
.. hvad mener du med at det fryser ?
Avatar billede arne_v Ekspert
28. juli 2004 - 11:10 #2
Accept returnere jo først når der kommer en connection ...
Avatar billede wisen Nybegynder
28. juli 2004 - 11:10 #3
'AcceptSocket' et et blocking kald - den fortsætter ikke før du modtager en forbindelse... er det det du oplever ?
Avatar billede medions Nybegynder
28. juli 2004 - 11:12 #4
:)

Jeg forsøger mig med flg. kode:

        public void startServer()
        {
           
            try
            {
                IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
               
                bool status = true ;
                string servermessage = "" ;
                string clientmessage = "" ;
                TcpListener tcpListener = new TcpListener(ipAddress, 1010);
                tcpListener.Start();
               
                Console.WriteLine("Server Started") ;
               
                //Socket socketForClient = tcpListener.AcceptSocket();
                Console.WriteLine("Client Connected") ;
               
                NetworkStream networkStream = new NetworkStream(socketForClient) ;
                StreamWriter streamwriter = new StreamWriter(networkStream);
                StreamReader streamreader = new StreamReader(networkStream);
                while(status)
                {
                    if(socketForClient.Connected)
                    {
                        servermessage = streamreader.ReadLine() ;
                        Console.WriteLine("Client:"+servermessage) ;
                        if((servermessage== "bye" ))
                        {
                            status = false;
                            streamreader.Close();
                            networkStream.Close();
                            streamwriter.Close();
                            //return 0;
                        }
                       
                        Console.Write("Server:") ;
                        clientmessage = Console.ReadLine() ;                     
   
                        streamwriter.WriteLine(clientmessage) ;
                        streamwriter.Flush() ;
   
                    }                                                             
               
                }
                streamreader.Close() ;
                networkStream.Close() ;
                streamwriter.Close() ;
                socketForClient.Close() ;
                Console.WriteLine("Exiting") ;
               
            }
            catch(Exception e)
            {
                MessageBox.Show(e.ToString()) ;
            }
           
        }

//>Rune
Avatar billede wisen Nybegynder
28. juli 2004 - 11:15 #5
... men igen - hvad mener du med at den 'fryser' ?
Avatar billede medions Nybegynder
28. juli 2004 - 11:16 #6
Altså det står bare stille... Jeg får ikke at se min windowsform...

//>Rune
Avatar billede medions Nybegynder
28. juli 2004 - 11:16 #7
Og jeg får ingen fejlmedd.

//>Rune
Avatar billede dsj Nybegynder
28. juli 2004 - 11:23 #8
I dette kald:

Socket socketForClient = tcpListener.AcceptSocket();

Sætter du den aktive proces til at blokere indtil en klient tilslutter til din tcpListener, som er bundet til en port. Metoden AcceptSocket() blokerer altså indtil den modtager en forbindelse. Vil du have din applikation til at køre videre, skal du placere kaldet af AcceptSocket() i en seperat tråd, således at den kan vente på en indgående forbindelse, mens resten af din server-applikation arbejder videre.
Avatar billede wisen Nybegynder
28. juli 2004 - 12:20 #9
Grunden til at du ikke får din form at se er som vi alle har skrevet, nemlig at AcceptSocket er en blokerende metode... som dsj skriver kan du f.eks. implementere det i en separat tråd.
Avatar billede dsj Nybegynder
28. juli 2004 - 18:13 #10
Spørgsmålet er også, om du overhovedet vil have din server til at lave noget, mens den venter på, at en klient tilslutter? Dette kunne f.eks. være at vente på at flere klienter tilslutter, således at serveren kan håndtere flere klienter på samme tid. Hvis dette er tilfældet, er det absolut nødvendigt at anvende flere tråde (minimum én pr. tilsluttede klient så længe du anvender blokerende streams til netværkskommunikatione, og én til din TcpListener-instans), og så går det hen og bliver lidt mere kompliceret end nu.
Avatar billede tomjelen Nybegynder
28. juli 2004 - 19:17 #11
I forbindelse med sockets, har jeg haft meget glæde af eksemplerne på asynkrone sockets på følgende link:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconnon-blockingserversocketexample.asp

Kan ske det også er noget du kan bruge til noget.
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