2016-04-04 20 views
2

İletişim kuracak ve bazı rasgele dosyalar gönderecek TCPIP sunucusu ve istemci uygulamaları yapmalıyım. Şimdiye kadar bu yapılmış:TCPIP sunucusu/klinik uygulama iletişimi nasıl düzeltilir

Sunucu:

static void Main(string[] args) 
{ 
    IPAddress localIP = IPAddress.Parse("127.0.0.1"); 
    TcpListener tcpServerListener = new TcpListener(localIP, 1234); 
    tcpServerListener.Start(); 
    Console.WriteLine("Service started..."); 
    while (true) 
    { 
     var serverSocket = tcpServerListener.AcceptTcpClient(); 
     Console.WriteLine("Request accepted!"); 
     if (serverSocket.Connected) 
     { 
      Do(serverSocket); 
     } 
     Console.WriteLine("Waiting for new request..."); 
     Console.ReadLine(); 
    } 
} 

private static void Do(TcpClient serverSocket) 
{ 
    var serverSockStream = serverSocket.GetStream(); 
    var reader = new StreamReader(serverSockStream); 
    var poruka = reader.ReadLine(); 
    var odgovor = "Hello " + poruka; 
    var writer = new StreamWriter(serverSockStream); 
    writer.Flush(); 
    reader.Close(); 
    writer.Close(); 
} 

Müşteri:

static void Main(string[] args) 
{ 
    TcpClient tcpClient = new TcpClient("127.0.0.1", 1234); 
    NetworkStream clientSockStream = tcpClient.GetStream(); 
    var writer = new StreamWriter(clientSockStream); 
    writer.WriteLine("TCP/IP Client"); 
    writer.Flush(); 
    var reader = new StreamReader(clientSockStream); 
    var odgovor = reader.ReadLine(); 
    Console.WriteLine("Answer received: " + odgovor); 
    writer.Close(); 
    reader.Close(); 
} 

Karşılıklı sorun olduğunu ben iletişimi, ikinci tepki çöker ulaşmak kez:

Her bir soket adresinin (protokol/ağ adresi/bağlantı noktası) yalnızca bir kullanımına normal olarak izin verilir

Peki, bu hatayı düzeltmek ve daha sonra dosyaları göndermeye nasıl izin verilir? (daha sonra serileştirme vb.)

+0

Bağlantı noktası tükenmesi hakkında bir makale var. Bir Biztalk makalesi olduğu gerçeğiyle yanıltılmasın, sorunun nasıl teşhis edileceğine dair biraz bilgi var: https://msdn.microsoft.com/en-us/library/aa560610(v=bts.20) .aspx – mnemonic

+3

Sunucuyu birden çok kez başlatmaya çalıştığınızdan emin misiniz? İstemciden farklı olarak, asla çıkmaz (ve Console.ReadLine, siz enter tuşuna basana kadar başka bir istemci almanızı engeller, neden bunu yapmak istediğinizden emin değilsiniz). Her neyse, TCP'nin doğru olması oldukça zor. Zaten çalışan bir şey kullanmak istemediğinden emin misin? Eğer evet ise, TCP'nin ilk olarak nasıl çalıştığını öğrenin ve pratikte karşılaşabileceğiniz sorunları ve tüm farklı durumları ve hata senaryolarını nasıl ele alacağınızı öğrenin. – Luaan

+1

Cevabınızı doğru olarak işaretleyebilmek için cevabınızı doğru olarak cevaplayabilirsiniz, çünkü sorunumu iletişim ile mi çözdünüz? Teşekkürler. @Luaan –

cevap

1

Sunucuyu birden çok kez başlatmaya çalıştığınızdan emin misiniz? İstemciden farklı olarak, sunucu hiç çıkmaz ve Console.ReadLine, siz enter tuşuna basana kadar başka bir istemci almanızı engeller. Eski sunucunun hala arka planda asılı olduğunu farz ediyorum, yeni bir tane başlatmaya çalışıyorsunuz, bu da başarısızlıkla sonuçlanıyor. ReadLine'dan kurtulun, sunucudan çıkmak için uygun bir yol ekleyin ve aynı anda birden çok sunucu çalıştırmayın ve iyi durumda olmalısınız.

Özel bir TCP istemci/sunucu uygulaması yazmak çok zor. TCP hala çok düşük seviyeli bir protokoldür ve muhtemelen beklediğiniz şekilde çalışmaz. Bu yolu izlemeyi seçerseniz, TCP'nin önce nasıl çalıştığını ve tüm iletişim durumlarını ve hatalarını nasıl ele alacağınızı öğrenin.

1

Arkadaş, burada tekerleği yeniden icat ediyor gibi görünüyorsun. Bunu yapmak için mevcut olan tüm teknolojilerle, bu şeyleri "yuva" düzeyinde yapmanın bir sebebi yok. Çok daha basit:

  • bir ucunda bir FTP sunucusu kullanın, ve FTP istemcisi yerleşik .NET
  • bir çağıran istemci akışı göndermesine olanak veren bir yöntem ile bir web hizmeti yaz.

Soketten başka bir şey. Çok zaman harcayacaksın.

+0

Biliyorum, ama bu benim görevim. Çok fazla olasılık olduğunu biliyorum, ama bunu yapmalıyım. @codenoire –

+0

Bir web servisi aslında bir TCP sunucusudur. –