2012-06-07 18 views
6

Hala geniş yeteneklere sahip çok dişli bir soket sistemi olan Indy'ye alışıyorum. Gördüğüm en büyük şeylerden biri, bir sunucu soketinin bir dizi farklı bağlantıya sahip olması. Örneğin, aynı IP adresinde 3 bağlantı noktası için 3 bağa sahip olabilirsiniz. Delphi XE2'de Indy 10 kullanıyorum. Ben ScktComps gelen eski moda TServerSocket ve TClientSocket bileşenlerini kullanır ve benim eski bir sistemi yeniden inşa ediyorumIndy Server'ın çoklu bağlantılarını ayrı soketler olarak mı kullanıyorsunuz?

Indy TIdTCPServer ve TIdTCPClient ile yeniden yapıyor. Eski sistem aslında her bir uçta 3 farklı sunucu/istemci soketi, her bir soket ayrı bir amaca hizmet ediyor ve birlikte çalışıyor - FTP'nin ikili veri için bir soket ve komutlar için diğer soketi nasıl kullandığı gibi.

Üç ayrı sunucu/istemci soketini, bu bileşenlerle aynı bileşen içerisinde taklit etmek mümkün mü? Sunucuda 3 farklı bağlantı noktasına bağlı, istemcide aynı 3 bağlantı noktasına sahip tek bir sunucu soketi bildirebilirseniz harika olur. Tek yapmak istediğim 3 ayrı sunucu/istemci soket bileşeni oluşturma ihtiyacını ortadan kaldırmak ve bunları bir araya getirmek.

cevap

12

Evet, aynı anda birden çok bağlantı noktasını yönetmek için tek bir TIdTCPServer kullanabilirsiniz. İstemci tarafında, yine de farklı bağlantı noktalarına bağlanmak için 3 farklı istemci bileşenine gereksiniminiz var.

TIdSocketHandle.Port özelliğinin TServerSocket.Port özelliğinin üyesi olduğu TIdTCPServer.Bindings koleksiyonunda, dinlemek istediğiniz her yerel IP/Bağlantı Noktası için bir tane olmak üzere 3 kayıt oluşturun. TServerSocket, belirli bir IP'ye bağlanmayı yerel olarak desteklemez (bazı manuel çalışmalarla yapılabilir), ancak TIdSocketHandle.IP özelliği, bu amaçla boş bir dizenin INADDR_ANY'a eşdeğer olduğu yerlerde kullanılır.

TIdCPServer.OnConnect, TIdCPServer.OnDisconnect yılında

ve TIdCPServer.OnExecute olaylar, aradığınız soketi bağlayıcı bağlı olan ayırt etmek TIdContext.Binding.IP ve TIdContext.Binding.Port özelliklerini kullanabilirsiniz.

Bunun yaygın bir kullanımı, farklı bağlantı noktalarındaki SSL ve SSL olmayan istemcileri desteklemektir; örneğin, farklı bağlantı noktalarında örtülü ve açık SSL/TLS'yi destekleyen POP3 ve SMTP gibi protokoller gibi. TIdHTTPServer, HTTP ve HTTPS URL'lerini tek bir sunucuda desteklemek için bunu yapar (hangi bağlantı noktalarının SSL/TLS'yi kullanmasa da özelleştirmek için TIdHTTPServer.OnQuerySSLPort'u kullanabilirsiniz). Örneğin

:

procedure TForm1.StartButtonCick(Sender: TObject); 
begin 
    IdTCPServer1.Active := False; 
    IdTCPServer1.Bindings.Clear; 

    with IdTCPServer1.Bindings.Add do 
    begin 
    IP := ...; 
    Port := 2000; 
    end; 

    with IdTCPServer1.Bindings.Add do 
    begin 
    IP := ...; 
    Port := 2001; 
    end; 

    with IdTCPServer1.Bindings.Add do 
    begin 
    IP := ...; 
    Port := 2002; 
    end; 

    IdTCPServer1.Active := True; 
end; 

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext); 
begin 
    case AContext.Binding.Port of 
    2000: begin 
     // do something... 
    end; 
    2001: begin 
     // do something else... 
    end; 
    2002: begin 
     // do yet something else ... 
    end; 
    end; 
end; 
+0

Müthiş, sadece her liman aynı bağlam parçacığı kendi iplik veya çoğu muhtemelen tüm 3 kullanıyor merak? –

+1

'Bindings' koleksiyonundaki her girdi, kendi bağlantı noktasında gelen bağlantıları kabul eden kendi iş parçacığında çalışır. Her kabul edilen istemci bağlantısı daha sonra kendi iş parçacığında da çalışır. Yani 3 'Bindings' girdiniz ve 3 bağlı istemciler varsa, bu 6 iş parçacığı çalışıyor. –

+0

Mükemmel, tam istediğim bu. –