2016-05-28 5 views
0

Ich erstelle eine Server-Client-Anwendung, bei der Server und Client miteinander kommunizieren können. Als ich die Startmethode auf dem Server aufrufen, erhalte ich einen Fehler dieses sagen:Server Start-Methode wirft Ausnahme, Port bereits in Verwendung?

Only one usage of each socket address (protocol/network address/port) is normally permitted 

Hier ist Program.cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Net; 
using System.Net.Sockets; 

namespace NetworkingTest { 
    class Program { 
     static void Main(string[] args) { 

      bool readLine = true; 
      string input = ""; 

      while (true) { 
       if (readLine == true) { 
        input = Console.ReadLine(); 
       } 

       if (input == "server") { 
        Server server = new Server(IPAddress.Any, 12346); 
        readLine = false; 
       } 

       if (input == "client") { 
        Client client = new Client(IPAddress.Parse("myipv4"), 12346); 
        readLine = false; 
       } 
      } 

     } 
    } 
} 

Hier ist Server.cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Net; 
using System.Net.Sockets; 
using System.Threading; 

namespace NetworkingTest { 
    class Server { 
     public TcpListener server; 

     public Server (IPAddress ip, int port) { 
      server = new TcpListener(ip, port); 
      server.Start(); 

      Thread serverRunThread = new Thread(new ThreadStart(RunServer)); 

      serverRunThread.Start(); 
     } 

     void RunServer() { 
      while (true) { 
       TcpClient client = server.AcceptTcpClient(); 
       Console.WriteLine("Client connected!"); 

       Thread serverHandlerThread = new Thread(new ParameterizedThreadStart(HandleClient)); 
       serverHandlerThread.Start(client); 
      } 
     } 

     void HandleClient(object c) { 
      TcpClient client = (TcpClient)c; 
      NetworkStream stream = client.GetStream(); 

      int i; 
      string data = null; 
      byte[] bytes = new byte[256]; 

      while((i = stream.Read(bytes, 0, bytes.Length)) != 0) { 
       data = Encoding.ASCII.GetString(bytes, 0, i); 
       Console.WriteLine("Received: " + data);  
      } 

      stream.Close(); 
      client.Close(); 
     } 
    } 
} 

Und hier ist Client.cs:

EDIT: Es gab ein Problem in Program.cs, while-Schleife festgelegt:

 while (readLine == true) { 
      input = Console.ReadLine(); 

      if (input == "server") { 
       Server server = new Server(IPAddress.Any, 12346); 
       readLine = false; 
      } 

      if (input == "client") { 
       Client client = new Client(IPAddress.Parse("10.0.0.5"), 12346); 
       readLine = false; 
      } 
     } 
+0

Jede Verbindung eine einzigartige Kombination aus folgenden haben muss: 1) Quell-IP-2) Ziel-IP-3) Portnummer. Wenn der Server und der Client sich auf demselben PC befinden, kann ein Fehler auftreten. Also folgendes tun: 1) Server hört auf IPAnyAddress mit Portnummer. 2) Der Client verbindet sich mit der IP-Adresse des Servers. IPAnyAddress behebt das Problem, da die IP-Adresse im Server nicht mit der des Clients identisch ist. – jdweng

+0

Beachten Sie, dass Ihr Code nicht repariert ist - er hat immer noch eine unendliche While-Schleife, aber jetzt verschwendet er nur noch Ihre CPU-Ressourcen. – Evk

+0

Ok jetzt sollte es behoben werden –

Antwort

1

, dass wegen der Fehler in Ihrer while(true) Schleife passiert. Zuerst fragen Sie den Benutzer nach einer Zeile mit Console.ReadLine(). Wenn input "Server" ist, starten Sie Ihren Server, ABER dann gehen Sie an den Anfang Ihrer While-Schleife und Ihre readLine Variable ist falsch, und input ist immer noch "Server", so dass es zweiten Server erstellt (im Grunde haben Sie Endlosschleife). Da Sie an diesem Port bereits einen Server haben, schlägt der zweite Versuch mit dem angezeigten Fehler fehl.

Um dies zu beheben, entfernen Sie while-Schleife, oder es tun mehr korrekt, wie folgt aus:

static void Main(string[] args) { 
    while (true) { 
     Console.WriteLine("Type \"server\" to start server, type \"client\" to start client, type \"exit\" to exit"); 
     string input = Console.ReadLine(); 

     if (input == "server") { 
      Server server = new Server(IPAddress.Any, 12346); 
     } 
     else if (input == "client") { 
      Client client = new Client(IPAddress.Parse("myipv4"), 12346); 
     } 
     else if (input == "exit") 
      return; 
    } 
} 
+0

Vielen Dank für Ihre Antwort. Ich habe die Frage mit dem festen Code aktualisiert. :) –