2016-05-28 20 views
0

この問題を尋ねる前に、C#でTCPサーバーとクライアントの例を探してみます。マルチスレッドTCPサーバーとクライアント

私はちょうど、リンクによって与えられたコードを使用するが、残念ながら問題があると私はストックしています、thisリンクを見つけました!

次のコードは、サーバーの完全なコードです(コンソール)

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()); 
       } 
      } 
     } 
    } 
} 

次のコードは、クライアントの完全なコードです(Windowsフォーム):

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); 
      } 
     } 
    } 
} 

毎回I動作して起動したサーバーのコードを実行します。しかし、クライアントを実行すると、サーバに例外エラー「Specified Argument was out of the range」が与えられます。私も同じエラー毎回iは、クライアントのフォームからbtn_sendをクリックして取得しています

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 

はここで完全な例外エラーです。

私はここの在庫だった、これは私がTCPソケットとの仕事だ初めてですので、私は問題だかわかりません。

アニノンは私を助けることができますか?

+0

私にとってこれは多くのコードを書くことです。あなたはそれを実際の重要なものに絞り込むことができますか? –

+0

@UweKeim - 申し訳ありませんが、完全なコードを投稿する方がよいでしょう。 – Servas

+0

btye配列を10025と宣言しますが、recievebuffersizeを使用してバイト数を読み込みます。これは、これらが同じではないことを示しています。 – BugFinder

答えて

1

問題は、あなたのコードは、2つの異なるサイズこの中

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

を使用したことです。 Youveは10025バイトのスペースを予約していますが、RecieveBufferSizeはおそらく別のサイズでも、それよりも大きくても小さくても構いませんが、大きければエラーになります。あなたが読み取りコールがあなたのバイト配列と同じ長さを呼び出す作る場合

あなたは文句を言わないあなたの問題を抱えています。

関連する問題