2016-04-20 5 views
0

Ich möchte einen einfachen Client-Server-Chat in C# erstellen. Mein Problem ist: wenn ich versuche, den Client mit dem Server zu verbinden. Ich habe diesen Fehler:Serverprobleme C#

Chat Server Started .... 
Unhandled exception: System.ArgumentOutOfRangeException: Specified argument out of range. 
Parameter name: size 
    in System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) 
    in ConsoleApplication1.Program.Main(String[] args) in D:\Visual Studio\Chat Client-Server\ConsoleApplication1\Program.cs:line 57 

P.S Ich übersetzte den Fehler in Englisch kann es zu Fehlern kommen.

Linie 57: networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);

komplettes Programm:

using System; 
using System.Threading; 
using System.Net.Sockets; 
using System.Text; 
using System.Collections; 
using System.Net; 

namespace ConsoleApplication1 

{ 

class Program 

{ 

    public static Hashtable clientsList = new Hashtable(); 



    static void Main(string[] args) 

    { 
     IPAddress ipAd = IPAddress.Parse("192.168.1.7"); 

     TcpListener serverSocket = new TcpListener(ipAd, 8001); 

     TcpClient clientSocket = default(TcpClient); 

     int counter = 0; 



     serverSocket.Start(); 

     Console.WriteLine("Chat Server Started ...."); 

     counter = 0; 

     while ((true)) 

     { 

      counter += 1; 

      clientSocket = serverSocket.AcceptTcpClient(); 



      byte[] bytesFrom = new byte[10025]; 

      string dataFromClient = null; 



      NetworkStream networkStream = clientSocket.GetStream(); 

      networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize); 

      dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom); 

      dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$")); 



      clientsList.Add(dataFromClient, clientSocket); 



      broadcast(dataFromClient + " Joined ", dataFromClient, false); 



      Console.WriteLine(dataFromClient + " Joined chat room "); 

      handleClinet client = new handleClinet(); 

      client.startClient(clientSocket, dataFromClient, clientsList); 

     } 



     clientSocket.Close(); 

     serverSocket.Stop(); 

     Console.WriteLine("exit"); 

     Console.ReadLine(); 

    } 



    public static void broadcast(string msg, string uName, bool flag) 

    { 

     foreach (DictionaryEntry Item in clientsList) 

     { 

      TcpClient broadcastSocket; 

      broadcastSocket = (TcpClient)Item.Value; 

      NetworkStream broadcastStream = broadcastSocket.GetStream(); 

      Byte[] broadcastBytes = null; 



      if (flag == true) 

      { 

       broadcastBytes = Encoding.ASCII.GetBytes(uName + " says : " + msg); 

      } 

      else 

      { 

       broadcastBytes = Encoding.ASCII.GetBytes(msg); 

      } 



      broadcastStream.Write(broadcastBytes, 0, broadcastBytes.Length); 

      broadcastStream.Flush(); 

     } 

    } //end broadcast function 

}//end Main class 





public class handleClinet 

{ 

    TcpClient clientSocket; 

    string clNo; 

    Hashtable clientsList; 



    public void startClient(TcpClient inClientSocket, string clineNo, Hashtable cList) 

    { 

     this.clientSocket = inClientSocket; 

     this.clNo = clineNo; 

     this.clientsList = cList; 

     Thread ctThread = new Thread(doChat); 

     ctThread.Start(); 

    } 



    private void doChat() 

    { 

     int requestCount = 0; 

     byte[] bytesFrom = new byte[10025]; 

     string dataFromClient = null; 

     Byte[] sendBytes = null; 

     string serverResponse = null; 

     string rCount = null; 

     requestCount = 0; 



     while ((true)) 

     { 

      try 

      { 

       requestCount = requestCount + 1; 

       NetworkStream networkStream = clientSocket.GetStream(); 

       networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize); 

       dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom); 

       dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$")); 

       Console.WriteLine("From client - " + clNo + " : " + dataFromClient); 

       rCount = Convert.ToString(requestCount); 



       Program.broadcast(dataFromClient, clNo, true); 

      } 

      catch (Exception ex) 

      { 

       Console.WriteLine(ex.ToString()); 

      } 

     }//end while 

    }//end doChat 

} //end class handleClinet 

}//end namespace 

Wie kann ich dieses Problem lösen? Danke im Voraus.

Antwort

0

könnten Sie

ändern
networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize); 

zu

networkStream.Read(bytesFrom, 0, 10025); 

die Größe des angegebenen Arrays entsprechen.

+0

Danke, jetzt habe ich einen neuen Fehler bekommen. System.InvalidOperationException: Operation nicht für nicht verbundene Sockets zulässig. in System.Net.Sockets.TcpClient.GetStream() in ConsoleApplication1.handleClinet.doChat() in D: \ Visual Studio \ Chat Client-Server \ Consoleapplication1 \ Program.cs: Zeile 206 –

+0

Zeile 206: NetworkStream networkStream = clientSocket .GetStream(); i P. S änderte auch Linie 208, die gleich war 57 –

+0

Sie müssen die Linie Connect() aufzurufen, auf der Clientsocket, bevor Sie GetStream() aufrufen. – PhilMasterG