Абсолютно, позвольте мне проверить это

твует два проекта C #: один проект для клиента, другой для сервера. Первый шаг - запустить сервер, затем выбрать целевую папку, после чего запустить клиентский проект, выбрать текстовый файл text.txt для отправки в целевую папку сервера.Только клиент может отправлять файлы на сервер

Демо-версия:

1.choosing file target                       2.client sends
   +------------+                                
   | tar folder |          <----------------       text.txt 
   +------------+

Моя проблема: в обоих проектах нет ошибок компиляции или синтаксических ошибок, единственная проблема заключается в том, что сервер не получает файл .txt.

Клиент:

Сначала я разработал форму для клиента, такую ​​как:

И поместил OpenFileDialog из элемента управления ToolBox-> Dialogs-> OpenFileDialog.

Полный код:

namespace SFileTransfer
{
    public partial class Form1 : Form
    {
        string n;
        byte[] b1;
        OpenFileDialog op;

        private void button1_Click(object sender, EventArgs e) //browse btn
        {
            op = new OpenFileDialog();
            if (op.ShowDialog() == DialogResult.OK)
            {
                string t = textBox1.Text;
                t = op.FileName;
                FileInfo fi = new FileInfo(textBox1.Text = op.FileName);
                n = fi.Name + "." + fi.Length;
                TcpClient client = new TcpClient("127.0.0.1", 8100);//"127.0.0.1", 5055
                StreamWriter sw = new StreamWriter(client.GetStream());
                sw.WriteLine(n);
                sw.Flush();
               // label2.Text = "File Transferred....";
            }
        }
        private void button2_Click(object sender, EventArgs e) //send btn
        {
            TcpClient client = new TcpClient("127.0.0.1", 8100);//5050
            Stream s = client.GetStream();
            b1 = File.ReadAllBytes(op.FileName);
            s.Write(b1, 0, b1.Length);
            client.Close();
           // label2.Text = "File Transferred....";
        }
    }
}
Сервер:

Создал и разработал форму для сервера, такую ​​как:

Затем поместил папкуBrowserDialog из ToolBox-> Dialogs-> folderBrowserDialog.

Полный код:

namespace SFileTransferServer
{
    public partial class Form1 : Form
    {
        string rd;
        byte[] b1;
        string v;
        int m=1;
        TcpListener list;
        TcpClient client;
        Int32 port = 8100;//5050
        Int32 port1 = 8100;//5055
        IPAddress localAddr = IPAddress.Parse("127.0.0.1");

        private void button1_Click(object sender, EventArgs e) //browse button
        {

            if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
            {
                textBox1.Text = folderBrowserDialog1.SelectedPath;

                list = new TcpListener(localAddr, port1);
                list.Start();

                client = list.AcceptTcpClient();
                MessageBox.Show("ggggggg" + m.ToString());
                Stream s = client.GetStream();
                b1 = new byte[m];

                s.Read(b1, 0, b1.Length);
                MessageBox.Show(textBox1.Text);
                File.WriteAllBytes(textBox1.Text+ "\\" + rd.Substring(0, rd.LastIndexOf('.')), b1);
                list.Stop();
                client.Close();
                label1.Text = "File Received......";
            }
        }
        private void Form2_Load(object sender, EventArgs e)
        {
            TcpListener list = new TcpListener(localAddr, port);
            list.Start();

            TcpClient client = list.AcceptTcpClient();
            MessageBox.Show("Client trying to connect");
            StreamReader sr = new StreamReader(client.GetStream());
            rd = sr.ReadLine();
            v = rd.Substring(rd.LastIndexOf('.') + 1);
            m = int.Parse(v);
            list.Stop();
            client.Close();
        }
    }
}

На основании этой страницы

 Error 40411 дек. 2017 г., 00:10
Я пытался играть с портами, но безуспешно
 Error 40411 дек. 2017 г., 00:28
Не нужно несколько подключений, только два компьютера,не требуется многопоточность
 Jamin11 дек. 2017 г., 03:46
@ Ошибка404 Если необходимы 2 отдельных компьютера, почему вы используете адрес обратной связи как на сервере, так и на клиенте? Я думал, что это был один компьютер, являющийся сервером и клиентом. Ваша проблема может исходить от того, что клиент возвращается к самому себе, а не к серверу. Возможно, изменить свой 127.0.0.1 на адрес сервера? Или это просто чтобы не показывать свой ip. Искренне любопытно Мне кажется, соединение, которое вы пытаетесь установить, это клиент-> сервер. Но вместо этого вы получаете клиент -> клиент.
 Kickass11 дек. 2017 г., 00:25
Вам понадобится несколько соединений / многопоточность?
 Jamin11 дек. 2017 г., 00:09
Ваш порт и порт1 - это один и тот же порт. Это специально?

Ответы на вопрос(1)

Решение Вопроса

что вы новый кодер, потому что я вижу много неэффективного кода.

В клиентском приложении: не объявляйте TcpClient заново, вместо этого объявите его в глобальной области и просто используйте его повторно.

Тогда на стороне сервера: всегда используйте правильный тип данных, ЕСЛИ ВСЕ возможно

Int16 port = 8100;
//same as
int port = 8100;

Затем к вопросу: сначала вы читаете только один байт из полученных данных.

int m=1;
byte[] b1 = new byte[m];
s.Read(b1, 0, b1.Length);
//Then if you know the length of the byte, why do the computation of b1.Length, just use
s.Read(b1, 0, 1);

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

Поэтому попробуйте объявить объект TcpListener в глобальной области видимости, затем назначить его в событии загрузки и начать прослушивание.

Теперь метод AcceptTcpClient () является методом блокировки, поэтому он будет блокировать ваш thead до тех пор, пока не получит попытку подключения, и в этот момент он вернет объект клиента. Поэтому попробуйте использовать это вместо:https://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener.accepttcpclient(v=vs.110).aspx

using System.Threading;
TcpClient client;
TcpListener server = new TcpListener("127.0.0.1",8100)
Thread incoming_connection = new Thread(ic);
incoming_connection.Start();

private void ic() {
client = server.AcceptTcpClient();
Stream s = client.GetStream();
//And then all the other code
}

Или вы можете использовать метод Pending, как это предлагается MSDN (на странице ссылок).

РЕДАКТИРОВАТЬ: используя потоки, как это'небезопасный', так что, если вы не понимаете многопоточность, сначала прочитайте об этом, в этом посте не рассматривается, как использовать многопоточность.

 Error 40411 дек. 2017 г., 14:02
Можете ли вы помочь мне сэтот также?
 Kickass11 дек. 2017 г., 01:20
Как я уже сказал, у меня нет компилятора или Windows. Если вы не понимаете ничего, что я написал, пожалуйста, спросите меня об этом
 Kickass11 дек. 2017 г., 14:08
Абсолютно, позвольте мне проверить это

Ваш ответ на вопрос