Как получить файл от нескольких клиентов одновременно через TCP-соединение, используя C #? - PullRequest
0 голосов
/ 27 февраля 2012

У меня есть сервер и несколько клиентов в моем проекте. Сервер должен отправлять файлы по запросу, и на нем хранятся файлы от клиентов. У меня есть кодирование, которое соединяется с несколькими клиентами, но получает один файл за раз. Другие запросы к хранилищу файлов продолжатся после того, как предыдущий файл будет получен полностью.

Размер моих файлов составляет около 200 МБ. Таким образом, требуется больше времени, чтобы ответить всем клиентам. Как я это решу. Любой, помогите мне. Заранее спасибо.

public partial class Form1 : Form
{
    byte[] Echo;
    byte[] a;
    Thread t1;
    int flag = 0;
    string receivedPath = "yok";
    public delegate void MyDelegate();
    private string fileName;
    public Form1()
    {
        t1 = new Thread(new ThreadStart(StartListening));
        t1.Start();
        InitializeComponent();
    }

    delegate void SetTextCallback(string text);

    public class StateObject
    {
        // Client socket.
        public Socket workSocket = null;

        public const int BufferSize = 8069;
        // Receive buffer.
        public byte[] buffer = new byte[BufferSize];
    }

    public static ManualResetEvent allDone = new ManualResetEvent(true);

    public void StartListening()
    {

        StateObject state = new StateObject();
        byte[] bytes = new Byte[8069];
        IPEndPoint ipEnd = new IPEndPoint(IPAddress.Any, 9050);
        Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        try
        {
            listener.Bind(ipEnd);
            listener.Listen(100);
            while (true)
            {
                allDone.Reset();
                listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
                allDone.WaitOne();

            }
        }
        catch (Exception ex)
        {
            SetText(ex.ToString());
        }

    }

    public void AcceptCallback(IAsyncResult ar)
    {

        Socket listener = (Socket)ar.AsyncState;
        Socket handler = listener.EndAccept(ar);

        StateObject state = new StateObject();
        state.workSocket = handler;
        handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, SocketFlags.None, new AsyncCallback(ReadCallback), state);
        flag = 0;


    }

    public void ReadCallback(IAsyncResult ar)
    {
        int fileNameLen = 1;
        String content = String.Empty;
        StateObject state = (StateObject)ar.AsyncState;
        Socket handler = state.workSocket;
        try
        {
            int bytesRead = handler.EndReceive(ar);
            if (bytesRead > 0)
            {

                if (flag == 0)
                {

                    fileNameLen = BitConverter.ToInt32(state.buffer, 0);
                    fileName = Encoding.UTF8.GetString(state.buffer, 4, fileNameLen);
                    receivedPath = @"D:\" + fileName;
                    flag++;

                }

                if (flag >= 1)
                {
                    BinaryWriter writer = new BinaryWriter(File.Open(receivedPath, FileMode.Append));
                    if (flag == 1)
                    {
                        writer.Write(state.buffer, 4 + fileNameLen, bytesRead - (4 + fileNameLen));
                        flag++;
                    }
                    else
                    writer.Write(state.buffer, 0, bytesRead);
                    writer.Close();
                    handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, SocketFlags.None, new AsyncCallback(ReadCallback), state);
                }
            }
            else
            {

                allDone.Set();
                Invoke(new MyDelegate(LabelWriter));
            }
        }
       catch
        {
        }
    }
    public void LabelWriter()
    {
        label1.Text = "Data has been received " + fileName;
    }

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        t1.Abort();
    }


}

1 Ответ

0 голосов
/ 27 февраля 2012

Вы можете вызвать событие allDone в методе AcceptCallback. Непосредственно после принятия клиента вы можете запустить процесс, который обменивается данными с этим клиентом, а в то же время начать прослушивание следующего клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...