2015-08-08 2 views
0

У меня есть небольшое приложение, которое отправляет изображения от клиента ко всем другим клиентам. На самом деле размер моего буфера установлен в 4096. Но мне нужно иметь динамический размер, чтобы я мог отправлять большие изображения. У любого из вас есть идея, что мне нужно изменить в моем коде?C# TCP Socket: отправка данных (изображений) с динамическим размером

Вот полный код (клиент и сервер находятся в одном приложении):

using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Net; 
using System.Net.Sockets; 
using System.Windows.Forms; 

namespace TCPClientServer 
{ 
    public partial class Main : Form 
    { 
     private Socket clientSocket; //The main client socket 
     private byte[] clientData = new byte[4096]; 
     private List<Socket> clientSockets = new List<Socket>(); 

     Socket serverSocket; //The main socket on which the server listens to the clients 
     byte[] serverData = new byte[4096]; 

     public Main() 
     { 
      InitializeComponent(); 
     } 

     #region AsyncCallback 
     #region ClientCallbacks 
     private void OnConnect(IAsyncResult result) 
     { 
      try 
      { 
       clientSocket.EndConnect(result); 

       clientData = new byte[4096]; 

       //Start listening to the data asynchronously 
       clientSocket.BeginReceive(clientData, 0, clientData.Length, SocketFlags.None, new AsyncCallback(OnClientReceive), null); 

       MessageBox.Show("Verbindung wurde hergestellt."); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
     } 

     private void OnClientSend(IAsyncResult result) 
     { 
      try 
      { 
       clientSocket.EndSend(result); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
     } 

     private void OnClientReceive(IAsyncResult result) 
     { 
      try 
      { 
       clientSocket.EndReceive(result); 

       Image msgReceived = ByteToImage(clientData); 
       pictureBox1.Image = msgReceived; 

       clientData = new byte[4096]; 

       clientSocket.BeginReceive(clientData, 0, clientData.Length, SocketFlags.None, new AsyncCallback(OnClientReceive), null); 

      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
     } 
     #endregion 
     #region ServerCallbacks 
     private void OnAccept(IAsyncResult result) 
     { 
      try 
      { 
       Socket client = serverSocket.EndAccept(result); 

       // save new client into clientlist 
       clientSockets.Add(client); 

       //Start listening for more clients 
       serverSocket.BeginAccept(new AsyncCallback(OnAccept), null); 

       //Once the client connects then start receiving the commands from her 
       client.BeginReceive(serverData, 0, serverData.Length, SocketFlags.None, new AsyncCallback(OnServerReceive), client); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
     } 

     public void OnServerSend(IAsyncResult result) 
     { 
      try 
      { 
       Socket client = (Socket) result.AsyncState; 
       client.EndSend(result); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
     } 

     private void OnServerReceive(IAsyncResult result) 
     { 
      try 
      { 
       Socket client = (Socket) result.AsyncState; 
       client.EndReceive(result); 

       //Transform the array of bytes received from the user 
       Image msgReceived = ByteToImage(serverData); 
       pictureBox1.Image = msgReceived; 

       //Send the message to all users 
       foreach (Socket socket in clientSockets) 
       { 
        socket.BeginSend(serverData, 0, serverData.Length, SocketFlags.None, new AsyncCallback(OnServerSend), socket); 
       } 

       serverData = new byte[4096]; 

       //Start listening to the message send by the user 
       client.BeginReceive(serverData, 0, serverData.Length, SocketFlags.None, new AsyncCallback(OnServerReceive), client); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
     } 
     #endregion 
     #endregion 

     private void btn_Client_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

       IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); 

       //Server is listening on port 15973 
       IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 15973); 

       //Connect to the server 
       clientSocket.BeginConnect(ipEndPoint, new AsyncCallback(OnConnect), null); 

       btn_Client.Enabled = false; 
       btn_Server.Enabled = false; 
       btn_Send.Enabled = true; 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
     } 

     private void btn_Server_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       //We are using TCP sockets 
       serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

       //Assign the any IP of the machine and listen on port number 15973 
       IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, 15973); 

       //Bind and listen on the given address 
       serverSocket.Bind(ipEndPoint); 
       serverSocket.Listen(4); 

       //Accept the incoming clients 
       serverSocket.BeginAccept(new AsyncCallback(OnAccept), null); 

       btn_Client.Enabled = false; 
       btn_Server.Enabled = false; 
       btn_Send.Enabled = false; 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
     } 

     private void btn_Send_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       Image img = new Bitmap(@"C:\Users\Kai\Desktop\microsoft-windows-10-icon.png"); 
       clientData = ImageToByte(img); 

       clientSocket.BeginSend(clientData, 0, clientData.Length, SocketFlags.None, new AsyncCallback(OnClientSend), null); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
     } 

     private byte[] ImageToByte(Image img) 
     { 
      ImageConverter converter = new ImageConverter(); 
      return (byte[]) converter.ConvertTo(img, typeof(byte[])); 
     } 

     private Image ByteToImage(byte[] bytes) 
     { 
      ImageConverter converter = new ImageConverter(); 
      return (Image) converter.ConvertFrom(bytes); 
     } 
    } 
} 

Thx заранее :)

+0

Вы должны разорвать большие файлы и отправить их в куски. – ThisHandleNotInUse

ответ

0

Это может помочь.

private int getImageBufferLength(Image image) 
    { 
     MemoryStream mStream = new MemoryStream(); 
     image.Save(mStream, image.RawFormat); 
     int length = mStream.ToArray().Length; 
     mStream.Dispose(); 
     return length; 
    }