Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


TcpListener problem

Postades av 2010-06-30 16:22:43 - Anders Malmgren, i forum c# (c-sharp), Tråden har 2 Kommentarer och lästs av 1847 personer

Hej alla!
Jag håller på att skriva en liten server för att hantera Subscribe / Publish över http (Comet kallas det ofta)

Problemet är att TcpListenern vägrar att acceptera nya connections medans en connection redan bearbetas. Hur löser man detta? Min testkod ser utshär.

(Saxa in denna i en main metod om du vill testa)

Testa att i IE eller FF connecta till localhost (Eller den dator du kör testkoden på). Servern kommer inte serva nästa connection förrens den förra är klar (Allså efter 5 sekunder i detta fallet pga Thread.Sleep), detta duger inte då jag kommer ha flera tusen connections uppe samtidigt.

Om ni undrar varför jag inte använder IIS så beror det på att IIS klarar inte så många trådar samtidigt.

            TcpListener listener = new TcpListener(80);
            listener.Start(100);

            while (true)
            {

                listener.BeginAcceptSocket(ar =>
                {
                    Socket client = (ar.AsyncState as TcpListener).EndAcceptSocket(ar);


                    ThreadPool.QueueUserWorkItem(obj =>
                    {
                        Socket s2 = obj as Socket;

                        Console.WriteLine("Serving client");

                        int length = 0;
                        byte[] buffer = new byte[client.SendBufferSize];
                        length = client.Receive(buffer);

                        string request = System.Text.ASCIIEncoding.ASCII.GetString(buffer);

                        string response = @"HTTP/1.1 200 OK
Cache-Control: private, s-maxage=0
Content-Type: text/plain; charset=utf-8
Expires: Mon, 31 May 2010 14:54:32 GMT
Server: Microsoft-IIS/7.0
X-AspNetMvc-Version: 2.0
X-AspNet-Version: 4.0.21006
X-Powered-By: ASP.NET
Date: Mon, 31 May 2010 14:54:32 GMT

Test";

                        UTF8Encoding encoding = new UTF8Encoding();
                        byte[] responeBytes = encoding.GetBytes(response);

                        Thread.Sleep(5000);

                        s2.Send(responeBytes);
                        s2.Close();

                    }, client);

                }, listener);


            }


Svara

Sv: TcpListener problem

Postades av 2010-07-13 10:34:56 - Ola Lindfeldt

Du har inte klarat av två trådar ens. Vad får dig att tro att du kan skriva en bättre webserver än IIS? :)
Det finns många problem här, t.ex. din första client är ju inte trådad. Och du ska inte tråda varje klient, det håller inte (om du ska klara tusentals).
Du behöver parsa HTTP strömmar. TCP ger dig bara en ström av bytes, inte färdiga HTTP-paket. Du har blandat ASCII och UTF8. Jag kan bara råda dig att dra nytta av IIS eller ngn annan webserver, du är inte mogen att uppfinna det hjulet igen.


Svara

Sv: TcpListener problem

Postades av 2010-10-18 13:45:02 - Jonatan Nyqvist

Mitt tips är att lära dig använda background worker (Det finns mycket info om det om du söker på google).

Gör sedan på så vis att du skapar en background worker, som sitter och lyssnar på tcp-anslutningar (med förslagsvis tcplistener), i sin egna tråd.
När den fått en anslutning ska du t.ex. sätta backgroundworkerns e.Result till den nya tcp-klienten som anslutit, och fånga upp det genom backgroundworkerns event "RunWorkerCompleted". Då är du tillbaka till din första tråd, och där i kan du starta om backgroundworkern (det blir alltså en rekursiv kod), och göra vad du vill göra med e.Result, som nu är anslutningen till klienten som anslöt.

Förenklat blir det så här:

BackgroundWorker bg = new BackgroundWorker();
bg.DoWork += new DoWorkEventHandler(bg_DoWork);
bg.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bg_RunWorkerCompleted);
bg.RunWorkerAsync();

void bg_DoWork(object sender, DoWorkEventArgs e)
{
  // Skapa en listener som lyssnar på anslutning

  e.Result = // tcp-anslutningen
}

void bg_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
  ((BackgroundWorker)sender).RunWorkerAsync();
  // Gör vad du vill med e.Result
}



Hoppas det var till hjälp!


Svara

Nyligen

  • 08:28 Butiksskyltar: Hur upplever utbude
  • 22:31 Slappna av
  • 19:55 kick-off med fokus på hälsa?
  • 19:53 kick-off med fokus på hälsa?
  • 16:24 Föreslå en skönhetsklinik online
  • 16:23 Föreslå en skönhetsklinik online
  • 18:42 Hvor finder man håndlavede lamper
  • 18:41 Hvor finder man håndlavede lamper

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 764
27 959
271 761
662
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies