Member 13805457 Ответов: 2

Помогите мне пожалуйста ! ! Мне нужно передать файл на языке Си#


Мне нужна простая программа. И локальная передача файлов с сокетом или чем-нибудь еще, пожалуйста, помогите мне. :(

Что я уже пробовал:

Я попробовал это сделать:

клиентский код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Net.NetworkInformation;
using System.IO;

namespace FileSharingClient
{
    public partial class Form1 : Form
    {
        private static string shortFileName = "";
        private static string fileName = "";
        public Form1()
        {
            InitializeComponent();
        }

        private void btnBrowse_Click(object sender, EventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.Title = "File Sharing Client";
            dlg.ShowDialog();
            txtFile.Text = dlg.FileName;
            fileName = dlg.FileName;
            shortFileName = dlg.SafeFileName;
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            string ipAddress = txtIPAddress.Text;
            int port = int.Parse(txtHost.Text);
            string fileName = txtFile.Text;
            Task.Factory.StartNew(() => SendFile(ipAddress,port,

             fileName,shortFileName));
            MessageBox.Show("File Sent");
        }

        public void SendFile(string remoteHostIP, int remoteHostPort, string  longFileName, string shortFileName)
        {
         try
         {
          if(!string.IsNullOrEmpty(remoteHostIP))
            {
             byte[] fileNameByte = Encoding.ASCII.GetBytes

             (shortFileName);
             byte[] fileData = File.ReadAllBytes(longFileName);
             byte[] clientData = new byte[4 + fileNameByte.Length

                + fileData.Length];
             byte[] fileNameLen = BitConverter.GetBytes(

              fileNameByte.Length);
             fileNameLen.CopyTo(clientData, 0);
             fileNameByte.CopyTo(clientData, 4);
             fileData.CopyTo(clientData, 4 + fileNameByte.Length);
             TcpClient clientSocket = new TcpClient(remoteHostIP,

              remoteHostPort);
             NetworkStream networkStream = clientSocket.GetStream();
             networkStream.Write(clientData, 0, clientData.GetLength

              (0));
             networkStream.Close();
           }
         }
         catch
         {

         }
        }
    }
}


серверный код:
<pre>using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Net.NetworkInformation;
using System.IO;
using System.Threading.Tasks;

namespace FileSharingServer
{
    public partial class Form1 : Form
    {

        public delegate void FileRecievedEventHandler(object source,string fileName);

        public event FileRecievedEventHandler NewFileRecieved;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.NewFileRecieved+=new FileRecievedEventHandler(Form1_NewFileRecieved);
        }

        private void Form1_NewFileRecieved(object sender, string
         fileName)
        {
            this.BeginInvoke(
            new Action(
            delegate()
            {
                MessageBox.Show("New File Recieved\n"+fileName);
                System.Diagnostics.Process.Start("explorer", @"c:\");
            }));
        }

        private void btnListen_Click(object sender, EventArgs e)
        {
            int port = int.Parse(txtHost.Text);
            Task.Factory.StartNew(() => HandleIncomingFile(port));
            MessageBox.Show("Listening on port"+port);
        }

        public void HandleIncomingFile(int port)
        {
          try
            {
                TcpListener tcpListener = new TcpListener(port);
                tcpListener.Start();
                while (true)
                {
                  Socket handlerSocket = tcpListener.AcceptSocket();
                    if (handlerSocket.Connected)
                    {
                     string fileName = string.Empty;
                     NetworkStream networkStream = new NetworkStream

                      (handlerSocket);
                     int thisRead = 0;
                     int blockSize = 1024;
                     Byte[] dataByte = new Byte[blockSize];
                     lock (this)
                     {
                      string folderPath = @"c:\";
                      handlerSocket.Receive(dataByte);
                      int fileNameLen = BitConverter.ToInt32(dataByte,

                       0);
                      fileName = Encoding.ASCII.GetString(dataByte, 4,

                       fileNameLen);
                      Stream fileStream = File.OpenWrite(folderPath +

                       fileName);
                      fileStream.Write(dataByte, 4+fileNameLen,(

                       1024-(4+fileNameLen)));
                      while (true)
                      {
                       thisRead = networkStream.Read(dataByte, 0,

                        blockSize);
                       fileStream.Write(dataByte, 0,thisRead);
                       if (thisRead == 0)
                        break;
                      }
                      fileStream.Close();

                    }
                    if (NewFileRecieved != null)
                     {
                       NewFileRecieved(this, fileName);
                     }
                    handlerSocket = null;
                    }
                }

            }
            catch
            {

            }
        }
    }
}


Его не работает помогите мне и это не мой код, я нашел некоторые сайты этот код. Помоги мне

2 Ответов

Рейтинг:
17

Wendelius

Просто сказать, что это не работает, не дает информации о возможных проблемах, которые у вас есть.

Однако одна очевидная проблема с обоими блоками кода заключается в том, что если что-то идет не так, пользователь не информируется и проблема не регистрируется. Это происходит потому, что у вас есть пустые блоки catch.

Для начала добавьте хотя бы окно сообщения или войдите в блоки catch, чтобы получить дополнительную информацию о потенциальных проблемах. Если возникает исключение, исследуйте весь стек исключений (внутренние исключения), чтобы получить четкое представление о том, что вызывает проблему. Таким образом, вы получаете что-то конкретное для работы.

ДОПОЛНЕНИЕ
--------
Одним из простых способов для вас исследовать проблему может быть просто закомментировать операторы try catch. Таким образом, когда возникает исключение, оно перехватывается Visual Studio. При возникновении исключения исследуйте его с помощью возможностей отладки Visual Studio.

Несколько статей для начала:
- Начало работы с отладчиком - Visual Studio | Microsoft Docs[^]
- Управление исключениями с помощью отладчика Visual Studio - Visual Studio | Microsoft Docs[^]


Wendelius

Смотрите обновленный ответ.

Рейтинг:
1

Member 13805457

Во первых спасибо что ответили мне :) Я сделал это, но ничего не понял. Я новичок в C#. У меня есть сервер и клиент для передачи сообщений. Я буду использовать передачу файлов в этом.


Patrice T

Чтобы обсудить с автором решение, используйте кнопку " есть вопрос или комментарий ?" в нижней части решения.