简体   繁体   English

C#TCP套接字:以动态大小发送数据(图像)

[英]C# TCP Socket: Sending data (images) with dynamic size

I have a little application which sends images from client to all other clients. 我有一个小应用程序,可以将图像从客户端发送到所有其他客户端。 Actually my buffer size is set to 4096. But I need to have a dynamic size, so that I can send larger images. 实际上,我的缓冲区大小设置为4096。但是我需要有一个动态大小,以便发送更大的图像。 Any one of you have an idea what I have to change in my code? 你们中的任何人都知道我必须在代码中进行哪些更改?

Here is the full code (server and client are in one app): 这是完整的代码(服务器和客户端在一个应用程序中):

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 in advance :) 提前谢谢:)

This might help. 这可能会有所帮助。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM