2016-05-28 12 views
0

Ich suche nur herum, bevor Sie dieses Problem stellen, zum Beispiel nach TCP Server und Client in C# suchen.Multithread-TCP-Server und Client

Ich fand this Link, ich habe gerade den angegebenen Code über den Link verwendet, aber leider gibt es ein Problem, und ich bin bestückt!

Der folgende Code ist der vollständige Code für Server (Konsole)

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

namespace TCP_Server_Console 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      TcpListener serverSocket = new TcpListener(8888); 
      int requestCount = 0; 
      TcpClient clientSocket = default(TcpClient); 
      serverSocket.Start(); 
      Console.WriteLine(" >> Server Started"); 
      clientSocket = serverSocket.AcceptTcpClient(); 
      Console.WriteLine(" >> Accept connection from client"); 
      requestCount = 0; 
      while ((true)) 
      { 
       try 
       { 
        requestCount = requestCount + 1; 
        NetworkStream networkStream = clientSocket.GetStream(); 
        byte[] bytesFrom = new byte[10025]; 
        networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize); 
        string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom); 
        dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$")); 
        Console.WriteLine(" >> Data from client - " + dataFromClient); 
        string serverResponse = "Last Message from client" + dataFromClient; 
        Byte[] sendBytes = Encoding.ASCII.GetBytes(serverResponse); 
        networkStream.Write(sendBytes, 0, sendBytes.Length); 
        networkStream.Flush(); 
        Console.WriteLine(" >> " + serverResponse); 
       } 
       catch (Exception ex) 
       { 
        Console.WriteLine(ex.ToString()); 
       } 
      } 
      clientSocket.Close(); 
      serverSocket.Stop(); 
      Console.WriteLine(" >> exit"); 
      Console.ReadLine(); 
     } 
    } 
} 


/*HandleClient Class */ 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net.Sockets; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 

namespace TCP_Server_Console 
{ 
    public class HandleClient 
    { 
     TcpClient clientSocket; 
     string clNo; 
     public void startClient(TcpClient inClientSocket, string clineNo) 
     { 
      this.clientSocket = inClientSocket; 
      this.clNo = clineNo; 
      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); 
        serverResponse = "Server to clinet(" + clNo + ") " + rCount; 
        sendBytes = Encoding.ASCII.GetBytes(serverResponse); 
        networkStream.Write(sendBytes, 0, sendBytes.Length); 
        networkStream.Flush(); 
        Console.WriteLine(" >> " + serverResponse); 
       } 
       catch (Exception ex) 
       { 
        Console.WriteLine(" >> " + ex.ToString()); 
       } 
      } 
     } 
    } 
} 

Der folgende Code ist der vollständige Code für Client (Windows Form):

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Net.Sockets; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace TCP_Client_Sample 
{ 
    public partial class Form1 : Form 
    { 

     System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient(); 
     NetworkStream serverStream; 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
     private void Form1_Load(object sender, EventArgs e) 
     { 
      label_status.Text = "Client Started, Connecting..."; 
      try { 
       clientSocket.Connect("127.0.0.1", 8888); 
       if (clientSocket.Connected) 
       { 
        label_status.Text = "Connected"; 
        label_status.ForeColor = Color.Green; 
       } 
      } 
       catch (Exception xe) { 
        MessageBox.Show("OOPS!!! SERVER MUST BE STARTED FIRST! \n\n" + xe.ToString()); 
       } 

     } 

     //Function to Send Message to Server (On Button Click) 
     private void btn_send_Click(object sender, EventArgs e) 
     { 
      try { 
       NetworkStream serverStream = clientSocket.GetStream(); 
       byte[] outStream = System.Text.Encoding.ASCII.GetBytes("Message From Client$"); 
       serverStream.Write(outStream, 0, outStream.Length); 
       serverStream.Flush(); 
       byte[] inStream = new byte[10025]; 
       serverStream.Read(inStream, 0, (int)clientSocket.ReceiveBufferSize); 
       string returnData = System.Text.Encoding.ASCII.GetString(inStream); 
       chatBox.AppendText(">> Server: " + returnData); 
      } 
      catch (Exception ex) { 
       MessageBox.Show("Unable to Send Data: " + ex); 
      } 
     } 
    } 
} 

Jedesmal, wenn ich Führe den Code des Servers aus, der funktioniert und gestartet wurde. Aber wenn ich den Client ausführe, erhält der Server einen Ausnahmefehler "Specified Argument was out of the range".

Dies ist die komplette Ausnahmefehler:

System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values. 
Parameter name: size 
    at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) 
    at TCP_Server_Console.Program.Main(String[] args) in C:\Users\user\Documents\Visual Studio 2015\Projects\TCP_Server_Console\TCP_Server_Console\Program.cs:line 50 

Ich bin auch der gleiche Fehler jedes Mal bekomme ich die btn_send von Client-Formular klicken.

Ich war hier hier und ich weiß nicht, was das Problem ist, da dies das erste Mal ist, dass ich mit TCP Socket arbeite.

Anynone kann mir helfen?

+0

Für mich ist das _way_ zu viel Code. Kannst du es auf die eigentlichen wichtigen Dinge eingrenzen? –

+0

@UweKeim - Es tut mir leid, obwohl es besser wäre, den vollständigen Code zu veröffentlichen. – Servas

+0

Sie deklarieren das Btye-Array als 10025, aber verwenden Sie dann recievebuffersize, um eine Anzahl von Bytes einzulesen, was darauf hindeutet, dass diese nicht identisch sind. – BugFinder

Antwort

1

Das Problem liegt darin, dass der Code zwei verschiedenen Größen verwendet

byte[] inStream = new byte[10025]; 
serverStream.Read(inStream, 0, (int)clientSocket.ReceiveBufferSize); 

In dieser. Sie haben Platz für 10025 Bytes reserviert, aber RecieveBufferSize vielleicht eine andere Größe, größer oder kleiner, aber wenn größer, wird es einen Fehler geben.

Wenn Sie den Leseaufruf die gleiche Länge wie Ihr Byte-Array nennen, haben Sie Ihr Problem nicht.