2016-05-28 71 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); 
      } 
     } 
    } 
} 

每次我执行它工作并启动的服务器的代码。但是当我执行客户端时,服务器给我一个异常错误“Specified Argument was out of the range”。

下面是完整的异常错误:

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 

我也得到同样的错误每次我从客户端窗体点击btn_send

我在这里的股票,我不知道是什么问题,因为这是我第一次与TCP套接字工作。

Anynone能帮助我吗?

+0

对我来说,这是很多代码。你能缩小到实际重要的东西吗? –

+0

@UweKeim - 抱歉,尽管发布完整代码会更好。 – Servas

+0

您将btye数组声明为10025,但是接下来使用recievebuffersize读取大量字节,它表明这些不一样。 – BugFinder

回答

1

的问题在于,你的代码中使用两种不同尺寸

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

在此。您预留了10025个字节的空间,但RecieveBufferSize可能是另一个大小,可能更大或更小,但如果更大,则会出错。

如果您将读取调用调用的长度与字节数组的长度相同,则不会出现问题。