Файловый поток с 3 серверов - PullRequest
0 голосов
/ 30 мая 2019

Я создаю графический интерфейс менеджера для выбора музыкального файла или файла фильма на сервере. Этот выбранный файл будет загружен с этого сервера в папку моего клиента. Как я могу сделать это с 3 серверами, работающими вместе с разделением чанков на себя?

Я делаю это с помощью C # Winforms в Visual Studio. Я реализовал это с 1 сервером, и он работает. Но когда я пытаюсь подключить 2-й или 3-й сервер к другому порту, клиентская программа зависает и передача байтов не происходит. Я пробовал многопоточность, но не могу подключиться к нескольким серверам, опять же.

Клиент

using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CiDoMa
{
    public partial class Form1 : Form
    {
        string fileName, fileInitName;

        public Form1()
        {
            InitializeComponent();
        }

        private void Music_button_Click(object sender, EventArgs e)
        {

            fileInitName = fileName_textbox.Text;

            if (fileInitName.Contains(".mp3"))
            {
                fileName = "Music/" + fileInitName;
            }

            else if (fileInitName.Contains(".mp4"))
            {
                fileName = "Movie/" + fileInitName;
            }
            progressBar1.Value = 0;
            IPEndPoint ipep1 = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);
            IPEndPoint ipep2 = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9060);
            IPEndPoint ipep3 = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9070);

            Socket server0 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            server0.Connect(ipep1);
            byte[] data = new byte[1024];
            data = Encoding.ASCII.GetBytes(fileName);
            server0.Send(data, data.Length, SocketFlags.None);

            using (FileStream to = new FileStream("../../" + fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite))
                {
                    byte[] buffer = new byte[1024];
                    int rcv = 1;
                    while (rcv!=0)
                    {
                        rcv = server0.Receive(buffer, 1024, SocketFlags.None);
                        to.Write(buffer, 0, buffer.Length);
                    }
                    progressBar1.Value += 100;
                }

            server0.Shutdown(SocketShutdown.Both);
            server0.Close();
        }
    }
}

Сервер

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;


namespace CiDoMaServer
{
    public partial class Form1 : Form
    {
        string fileName = "";
        IPEndPoint ipep, ipep2, ipep3;
        int rcv;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void Server_init_Click(object sender, EventArgs e)
        {
            ipep = new IPEndPoint(IPAddress.Any,
                9050);
            ipep2 = new IPEndPoint(IPAddress.Any,
                9060);
            ipep3 = new IPEndPoint(IPAddress.Any,
                9070);
            IPEndPoint[] ipPoints = new IPEndPoint[3] { ipep, ipep2, ipep3 };

            Socket[] scon = new Socket[3];
            Socket[] server = new Socket[3];

            for (int i = 0; i < scon.Length; i++)
            {
                scon[i] = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                scon[i].Bind(ipPoints[i]);
                //scon[i].Listen(10);
                //server[i] = scon[i].Accept();
            }
            scon[0].Listen(10);
            server[0] = scon[0].Accept();
            byte[] data = new byte[1024];
            rcv = server[0].Receive(data, data.Length, SocketFlags.None);
            fileName = Encoding.ASCII.GetString(data);

            while (rcv != 0) {
            using (FileStream from = new FileStream("../../" + fileName, FileMode.Open, FileAccess.Read))
            {
                int readCount;
                byte[] buffer = new byte[1024];
                while ((readCount = from.Read(buffer, 0, 1024)) != 0)
                {
                    server[0].Send(buffer, 1024, SocketFlags.None);
                }
                }
            }
            server[0].Close();
            scon[0].Close();

            /*for(int i=0; i<scon.Length; i++) { 
                server[i].Close();
                scon[i].Close();
            }*/
        }
    }
}

1 Ответ

0 голосов
/ 30 мая 2019

Если вы создаете сервер для одновременного обслуживания нескольких клиентов, ваш сервер должен поддерживать асинхронную и многопоточность.И работать с многопоточностью нелегко, поэтому я подумал, что это причина, по которой вы потерпели неудачу с многопоточностью, но вы можете попытаться сделать ее лучше

Пример: вы можете взглянуть на этот пример исходного кода

и асинхронный сокет

Надеюсь, это поможет вам

...