Avatar billede winkill Nybegynder
27. maj 2002 - 16:13 Der er 16 kommentarer og
1 løsning

TcpClient

Hvordan checker jeg om klienten som er forbundet til min TcpClient har afbrudt forbindelsen?
Avatar billede a1a1 Novice
27. maj 2002 - 18:25 #1
umiddelbart kan jeg ikke finde noget i docs om det.

men hvad med en try catch ?
Avatar billede winkill Nybegynder
27. maj 2002 - 19:48 #2
Her er min kode.

AcceptConnection bliver kørt med en new Thread(new ThreadStart(AcceptConnection)) men den eneste måde jeg kan se at en try catch løsning skulle kunne klare det er ved at prøve at sende data... men hvis klienten så IKKE har lukket forbindelsen, vil klienten jo også modtage disse data, hvilket jo ikke dur...

Nogen idéer?


private void AcceptConnection()
{
    char byteBuffer;
    string Buffer = "";
   
    TcpClient tcpClient = tcpListener.AcceptTcpClient();
    NetworkStream netStream = tcpClient.GetStream();
   
    SendLine(tcpStream, "Server ready..");
   
    while(true)
    {
        try
        {
            if(netStream.DataAvailable)
            {
                byteBuffer = (char)netStream.ReadByte();
               
                Buffer += Convert.ToString(byteBuffer);
               
                if(Buffer.EndsWith("\r\n"))
                {
                    Buffer = Buffer.Substring(0, Buffer.Length - 2);
                    // Process command
                    MessageBox.Show(Buffer);
                    Buffer = "";
                }
            }
            Thread.Sleep(50);
        }
        catch(Exception e)
        {
            // Display exception and shut down this connection
            MessageBox.Show(e.ToString());
            tcpStream.Close();
            tcpClient.Close();
            return;
        }
        if(state < 1) // Server state property [0 is Stopped, -1 is Terminating]
        {
            // Shut down this connection
            netStream.Close();
            tcpClient.Close();
            return;
        }
    }
}
Avatar billede winkill Nybegynder
27. maj 2002 - 19:49 #3
Nå ja... koden er i C# men objekterne er jo de samme som i VB og J, så en løsning i et af disse sprog er også acceptabel.
Avatar billede a1a1 Novice
27. maj 2002 - 20:37 #4
du har jo egentlig denne..

while(true)
    {
}

prøv med
while(true)
    {

} else {
MessageBox.Show("client closed");
}

:)
Avatar billede winkill Nybegynder
27. maj 2002 - 21:09 #5
Hmmm... else kræver et if og da expression'en true altid er sand, ville eks. if(true) {...} else {...} aldrig resulterer i at else {...} bliver kørt.

;)
Avatar billede a1a1 Novice
27. maj 2002 - 21:16 #6
nå ja....

så wend da :)
Avatar billede a1a1 Novice
27. maj 2002 - 21:17 #7
skal være uden noget

:)

while(true)
    {

}
MessageBox.Show("client closed");
Avatar billede winkill Nybegynder
27. maj 2002 - 22:32 #8
?
Avatar billede a1a1 Novice
27. maj 2002 - 23:59 #9
du checker jo while(true) // så længe clientenlytter....
Avatar billede winkill Nybegynder
28. maj 2002 - 11:13 #10
Jeg gentager lige mit oprindelige spørgsmål...

Hvordan checker jeg om klienten som er forbundet til min TcpClient har afbrudt forbindelsen?
Avatar billede jakobandersen Nybegynder
28. maj 2002 - 11:22 #11
Kig på denne side, der er et eksempel på implementation af en OnDisconnet eventhandler:

http://msdn.microsoft.com/library/library/en-us/dnadvnet/html/vbnet08282001.asp

Basalt set går det ud på at du skal have en:

tcpClient.DisConnected()

i dit script som dropper dit objekt. og derved fanger din try statement fejlen
Avatar billede a1a1 Novice
28. maj 2002 - 11:23 #12
det GØR DU...........

du checker jo while(true) // så længe clientenlytter....

while(true)
    {
try
        {
            if(netStream.DataAvailable)
            {
                byteBuffer = (char)netStream.ReadByte();
               
                Buffer += Convert.ToString(byteBuffer);
               
...............
............ osv osv



}
MessageBox.Show("client closed");

prøv at se om det ikke dur sådan
Avatar billede winkill Nybegynder
28. maj 2002 - 12:53 #13
a1 >>
while(true) {...} kører i al evighed, derfor skal jeg checke om der stadigt er forbindelse - ellers bliver loopet aldrig afsluttet.


Moonduck >>

Jeg får en "Page not found" på den side... det lyder ellers rigtigt interessant!

Jeg har midlertidigt løst problemet ved at lave en form for timer der lukker forbindelsen efter 20 secs. inaktivitet, men det er ikke holdbart i længden, så kunne du ikke checke at linket er korrekt eller evt. poste artiklen her ?
Avatar billede jakobandersen Nybegynder
28. maj 2002 - 12:55 #14
Avatar billede jakobandersen Nybegynder
28. maj 2002 - 12:55 #15
Avatar billede winkill Nybegynder
30. maj 2002 - 20:00 #16
Cool, tak
Avatar billede winkill Nybegynder
05. juni 2002 - 20:53 #17
Ok, hvis der er nogen der er interesseret kan jeg da lige fortælle at jeg fandt en måske mindre kapacitets krævende metode til at checke om en TcpClient har mistet forbindelsen. Dette kan evt. også laves med en Thread sådan at det kan køre som en sepperat process.

while(true)
{
    byteBuffer = new Byte[1024];
    stream.Read(byteBuffer, 0, byteBuffer.Length);
    if(byteBuffer[0] == (byte)0) break; // Hvis forbindelsen er afbrudt så "sluk"
    // Gør noget med de modtagne data
}
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

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



IT-JOB