Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/34: Рейтинг темы: голосов - 34, средняя оценка - 4.59
0 / 0 / 0
Регистрация: 02.12.2012
Сообщений: 8

Не удается подключится к серверу. В чем может быть ошибка?

02.12.2013, 22:14. Показов 6726. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал клиент-сервер для передачи файлов. С сетями имею дело в первый раз. В предыдущей версии данной программы разбил на куски прослушку и отправку файла в сервере, и подключение к серверу и прием файла в клиенте. Подключение осуществлялось, но передача файлов нет. В данной версии, не осуществляется даже подключение. Опыта в данном деле нет, поэтому если кто-то сталкивался с подобными задачами и укажет на ошибку, буду очень благодарен.
Сервер
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
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.Sockets;
using System.Threading;
using System.Net;
using System.IO;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public string filename;
        TcpClient handler;
        TcpListener sListener;
 
 
        public Form1()
        {
            InitializeComponent();
        }
 
 
 
 
        //Выбор файла и извлечение его имени
        private void browseButton_Click(object sender, EventArgs e)
        {
                using (OpenFileDialog selectfile = new OpenFileDialog())
                {
                    if (selectfile.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    {
                        LogBox.Text = "Файл выбран";
                        filename = selectfile.FileName;
                    }
                }
            
         
        }
 
 
        private void Transfer_Click(object sender, EventArgs e)
        {
           // Создаем конечную сетевую точку для прослушивания любого IP и портом 11000
            IPEndPoint myEndpoint = new IPEndPoint(IPAddress.Any, 11000);
            try
            {
                sListener = new TcpListener(myEndpoint);
            
                //Начинаем прослушивание, очередь которого в 100 заявок
                sListener.Start(100);
                LogBox.Text = Environment.NewLine + "Создаем сокет";
                //Обрабатываем запросы подключения к серверу, если имеются принимаем и начинаем работу с сокетом handler
                while (true)
                {
                    Application.DoEvents();
                    if (sListener.Pending())
                    {
                        handler = sListener.AcceptTcpClient();
                        sListener.Stop();
                        LogBox.Text = Environment.NewLine + "Клиент подключен";
                    }
                }
            }
            catch
            {
                LogBox.Text = Environment.NewLine + "Не удалось подключиться к клиенту";
            }
 
            if (handler.Connected)
            {
                //Переводим данные файла в универсальный формат чтения и записи, после в двоичный и получаем данные на клиентский совет
                using (FileStream inputStream = File.OpenRead(filename))
                using (NetworkStream outputStream = handler.GetStream())
                using (BinaryWriter writer = new BinaryWriter(outputStream))
                {
                    long lenght = inputStream.Length;
                    long totalBytes = 0;
                    int readBytes = 0;
                    byte[] buffer = new byte[2048];
 
                    writer.Write(Path.GetFileName(filename));
                    writer.Write(lenght);
 
                    do
                    {
                        readBytes = inputStream.Read(buffer, 0, buffer.Length);
                        outputStream.Write(buffer, 0, readBytes);
                        totalBytes += readBytes;
 
                    } while (handler.Connected && totalBytes < lenght);
                }
                handler.Close();
            }
            }
     
 
        private void Cancel_Click(object sender, EventArgs e)
        {
            //Если подключен клиентской сокет, отключаем его
            if (handler.Connected) handler.Close();
            LogBox.Text = Environment.NewLine+"Передача отменена";
        }
 
       
 
 
 
    }
    }
Клиент
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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.Sockets;
using System.IO;
using System.Net;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        TcpClient client;
        string folder;
        public Form1()
        {
            InitializeComponent();
        }
 
 
 
 
 
        private void Cancel_Click(object sender, EventArgs e)
        {
            if (client.Connected) client.Close();
        }
 
      
 
 
   
 
        private void ReceiveFile_Click(object sender, EventArgs e)
        {
            IPHostEntry localMachineInfo = Dns.GetHostEntry(Dns.GetHostName());
            IPEndPoint myEndpoint = new IPEndPoint(localMachineInfo.AddressList[0], 11000);
 
            client = new TcpClient(myEndpoint);
 
            try
            {
                client.Connect(myEndpoint);
                LogBox.Text = Environment.NewLine + "Подключение к серверу";
            }
            catch
            {
                LogBox.Text = Environment.NewLine + "Не удалось подключится к серверу";
            }
 
            if (client.Connected)
            {
 
                using (NetworkStream inputStream = client.GetStream())
                using (BinaryReader reader = new BinaryReader(inputStream))
                {
                    string filename = reader.ReadString();
                    long lenght = reader.ReadInt64();
 
                    using (FileStream outputStream = File.Open(Path.Combine(folder, filename), FileMode.Create))
                    {
                        long totalBytes = 0;
                        int readBytes = 0;
                        byte[] buffer = new byte[2048];
 
                        do
                        {
                            readBytes = inputStream.Read(buffer, 0, buffer.Length);
                            outputStream.Write(buffer, 0, readBytes);
                            totalBytes += readBytes;
 
                        } while (client.Connected && totalBytes < lenght);
                        client.Close();
                    }
                }
            }
        }
 
        private void BrowseButton_Click(object sender, EventArgs e)
        {
            using (folderBrowserDialog1 = new FolderBrowserDialog())
                if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
                   folder = folderBrowserDialog1.SelectedPath;
                   textBox2.Text=folderBrowserDialog1.SelectedPath;
            
        }
 
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.12.2013, 22:14
Ответы с готовыми решениями:

Не удается подключится к локальному серверу
Тема не новая, но нигде внятного объяснения решения ее я не нашел. Сегодня, запустив Среду Microsoft SQL Server Management Studio, при...

В чем может быть ошибка
В чем может быть ошибка

В чём может быть ошибка
Здравствуйте, помогите пожалуйста решить проблемму: Сайт нормально работал в течении года, в том числе и вчера - после внесения...

10
48 / 48 / 22
Регистрация: 18.11.2013
Сообщений: 92
02.12.2013, 23:41
посмотрел по диагонали, ибо все это вогнанно в какую то форму, но для начала бы посоветовал вот в этих строчках
C#
1
IPEndPoint myEndpoint = new IPEndPoint(IPAddress.Any, 11000);
C#
1
IPEndPoint myEndpoint = new IPEndPoint(localMachineInfo.AddressList[0], 11000);
указать IP адресс - IPAdress.Loopback чтобы убедиться что проблемы все таки в коде
и да, у вас шикарная обработка исключений) смотрите хотя бы в дебаггере что вбрасывается
0
0 / 0 / 0
Регистрация: 02.12.2012
Сообщений: 8
03.12.2013, 00:02  [ТС]
nb-np,
Цитата Сообщение от nb-np Посмотреть сообщение
указать IP адресс - IPAdress.Loopback чтобы убедиться что проблемы все таки в коде
эффект тот же. сообщение из единственного исключения, что клиент не подключился к серверу.
запускаю отладку, чистый лист.
0
48 / 48 / 22
Регистрация: 18.11.2013
Сообщений: 92
03.12.2013, 01:53
ох уж эти ваши готовые листнеры/клиенты, на голых сокетах не модно) ну ладно
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//енто хозяйство в обработчике кнопки? не, так не делается
sListener.Start(100);
LogBox.Text = Environment.NewLine + "Создаем сокет";
while (true)
{
    Application.DoEvents();//не надо так, я не гуру в потоках
    // но этот бесконечный цикл надо отсюда куда то убрать, возможно в отдельный поток...
    if (sListener.Pending())
    {
        handler = sListener.AcceptTcpClient();
        sListener.Stop(); //правда? листнер закроется при первом подкючении и дальше выпадет в catch
        //ибо вы его остановили и не запустили, а запуск он вооон там повыше, до цикла
 
        LogBox.Text = Environment.NewLine + "Клиент подключен";
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//а вот так тоже не надо делать
client = new TcpClient(myEndpoint);
//по-моему надо вот так client = new TcpClient();
//потому что при использовании того конструктора он сразу попытается подключиться и 
try
{
    //дойдя до сюда вбросит исключение, что мол сокет уже юзается 
    client.Connect(myEndpoint);
    LogBox.Text = Environment.NewLine + "Подключение к серверу";
}
catch
{
    LogBox.Text = Environment.NewLine + "Не удалось подключится к серверу";
}
пока так
1
0 / 0 / 0
Регистрация: 02.12.2012
Сообщений: 8
03.12.2013, 21:24  [ТС]
Подделал и то и другое, все равно не работает.
Сервер
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
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.Sockets;
using System.Threading;
using System.Net;
using System.IO;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public string filename;
        TcpClient handler;
        TcpListener sListener;
        Thread Listen;
        Thread clientThread;
 
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void ListenerThread()
        {  
            // Создаем конечную сетевую точку для прослушивания любого IP и портом 11000
             IPAddress ipAddress = Dns.GetHostEntry("localhost").AddressList[0];
             IPEndPoint myEndpoint = new IPEndPoint(ipAddress, 11000);
       
                sListener = new TcpListener(myEndpoint);
            
                //Начинаем прослушивание, очередь которого в 100 заявок
                sListener.Start(100);
                LogBox.Text = Environment.NewLine + "Попытка подключения";
                //Обрабатываем запросы подключения к серверу, если имеются принимаем и начинаем работу с сокетом handler
                while (true)
                {
                    try
                    {
                        Application.DoEvents();
                        if (sListener.Pending())
                        {
                            handler = sListener.AcceptTcpClient();
                            LogBox.Text = Environment.NewLine + "Клиент подключен";
                            clientThread = new Thread(new ThreadStart(Send));
                            clientThread.Start(handler);
                        }
                    }
                    catch
                    {
                        Listen.Abort();
                        LogBox.Text = Environment.NewLine + "Не удалось подключиться к клиенту ";
                        return;
                    }
                   }
 
        }
 
 
        //Выбор файла и извлечение его имени
        private void browseButton_Click(object sender, EventArgs e)
        {
                using (OpenFileDialog selectfile = new OpenFileDialog())
                {
                    try
                    {
                        if (selectfile.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                        {
                            LogBox.Text = "Файл выбран";
                            filename = selectfile.FileName;
                        }
                    }
                    catch
                    {
                        LogBox.Text = "Файл выбран";
                        return;
                    }
                }
            
         
        }
 
        private void Send()
        {
         if (handler.Connected)
            {
                //Переводим данные файла в универсальный формат чтения и записи, после в двоичный и получаем данные на клиентский совет
             try
             {
                using (FileStream inputStream = File.OpenRead(filename))
                using (NetworkStream outputStream = handler.GetStream())
                using (BinaryWriter writer = new BinaryWriter(outputStream))
                {
                    long lenght = inputStream.Length;
                    long totalBytes = 0;
                    int readBytes = 0;
                    byte[] buffer = new byte[2048];
 
                    writer.Write(Path.GetFileName(filename));
                    writer.Write(lenght);
 
                    do
                    {
                        readBytes = inputStream.Read(buffer, 0, buffer.Length);
                        outputStream.Write(buffer, 0, readBytes);
                        totalBytes += readBytes;
 
                    } while (handler.Connected && totalBytes < lenght);
                    LogBox.Text = Environment.NewLine + "Файл передан";
                }
             }
                 catch
             {
                 handler.Close();
                 sListener.Stop();
                 clientThread.Abort();
                 Listen.Abort();
                 LogBox.Text = Environment.NewLine + "Передача не удалась";
                 return;
              }
                handler.Close();
                sListener.Stop();
                clientThread.Abort();
                Listen.Abort();
         }
        }
 
        private void Transfer_Click(object sender, EventArgs e)
        {
            if (filename != "")
            {
                try
                {
                    Listen = new Thread(new ThreadStart(ListenerThread));
                    Listen.Start();
                    Listen.IsBackground = true;
                }
                catch
                {
                    sListener.Stop();
                    Listen.Abort();
                    LogBox.Text = Environment.NewLine + "Передача отменена";
                    return;
                }
            }
            else MessageBox.Show("Выберите файл!!!");
       
        }
     
 
        private void Cancel_Click(object sender, EventArgs e)
        {
            //Если подключен клиентской сокет, отключаем его
            if (handler.Connected)
            {
                handler.Close();
                sListener.Stop();
                clientThread.Abort();
                Listen.Abort();
                LogBox.Text = Environment.NewLine + "Передача отменена";
            }
        }
    }
   }
Клиент
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
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.Sockets;
using System.IO;
using System.Net;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        TcpClient client;
        string folder;
 
        public Form1()
        {
            InitializeComponent();
        }
 
 
 
 
 
        private void Cancel_Click(object sender, EventArgs e)
        {
            if (client.Connected) client.Close();
        }
 
        private void SetConnection()
        {
            client = new TcpClient();
 
            try
            {
                client.Connect("localhost", 11000);
                LogBox.Text =Environment.NewLine+"Подключение к серверу";
            }
            catch
            {
                LogBox.Text =Environment.NewLine+"Не удалось подключится к серверу";
                return;
            }
        }
 
 
   
 
        private void ReceiveFile_Click(object sender, EventArgs e)
        {
            if (folder != "")
            {
                SetConnection();
                if (client.Connected)
                {
                    try
                    {
                        using (NetworkStream inputStream = client.GetStream())
                        using (BinaryReader reader = new BinaryReader(inputStream))
                        {
                            string filename = reader.ReadString();
                            long lenght = reader.ReadInt64();
 
                            using (FileStream outputStream = File.Open(Path.Combine(folder, filename), FileMode.Create))
                            {
                                long totalBytes = 0;
                                int readBytes = 0;
                                byte[] buffer = new byte[2048];
 
                                do
                                {
                                    readBytes = inputStream.Read(buffer, 0, buffer.Length);
                                    outputStream.Write(buffer, 0, readBytes);
                                    totalBytes += readBytes;
 
                                } while (client.Connected && totalBytes < lenght);
                                client.Close();
                                LogBox.Text = Environment.NewLine + "Файл принят";
                            }
                        }
                    }
                    catch
                    {
                        LogBox.Text = Environment.NewLine + "Не удалось принять файл";
                    }
                }
            }
            else MessageBox.Show("Выберите путь");
        }
 
        private void BrowseButton_Click(object sender, EventArgs e)
        {
            try
            {
                using (folderBrowserDialog1 = new FolderBrowserDialog())
                    if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
                        folder = folderBrowserDialog1.SelectedPath;
                textBox2.Text = folderBrowserDialog1.SelectedPath;
                LogBox.Text = "Выбран путь";
            }
            catch
            {
                LogBox.Text ="Не удалось выбрать путь";
                return;
            }
        }
 
    }
}
0
48 / 48 / 22
Регистрация: 18.11.2013
Сообщений: 92
03.12.2013, 23:19
вот наваял (вернее переделал) колхозно-костыльный "чатик", он работает, несомтря на костыли принципы должны быть понятны, попытайтесь туда прикрутить передачу файлов...ну если не получится - завтра наваяю такую же передачу файлов)
колхозный клент сервер.zip
1
48 / 48 / 22
Регистрация: 18.11.2013
Сообщений: 92
03.12.2013, 23:43
упс, какая там косячина) textBox1.AppendText(buffer.ToString()); ну вы поняли что я хотел сделать)
0
0 / 0 / 0
Регистрация: 02.12.2012
Сообщений: 8
04.12.2013, 01:37  [ТС]
Цитата Сообщение от nb-np Посмотреть сообщение
упс, какая там косячина) textBox1.AppendText(buffer.ToString()); ну вы поняли что я хотел сделать)
Понял. Это не столь критично. Спасибо за работающий пример, ибо кодов и статей много, а начинаешь проверять не все работает. Попробую, использовать Ваш коннект, может заработает. У меня еще есть мысль, что слишком много вешается на одно событие процессов.

Добавлено через 1 час 44 минуты
В клиенте на данной строке
C#
1
     client.Connect(myEndpoint);
ошибка

System.Net.Sockets.SocketException (0x80004005): Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение 127.0.0.1:11000
в System.Net.Sockets.Socket.DoConnect(EndP oint endPointSnapshot, SocketAddress socketAddress)
в System.Net.Sockets.Socket.Connect(EndPoi nt remoteEP)
в System.Net.Sockets.TcpClient.Connect(IPE ndPoint remoteEP)

Адаптация кодов такая
Сервер:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public string filename;
        TcpClient handler;
        TcpListener sListener;
        Thread thread;
        Boolean end = false;
 
 
 
 
        public Form1()
        {
            InitializeComponent();
            IPEndPoint myEndpoint = new IPEndPoint(IPAddress.Loopback, 11000);
            sListener = new TcpListener(myEndpoint);
 
        }
 
        private void listen()
        {
            try
            {
 
                sListener.Start(100);
                LogBox.Text = "Начинаем прослушку\r\n";
                end = false;
                while (!end)
                {
                    if (sListener.Pending())
                    {
                        // принимаем ожидающий запрос
                        handler = sListener.AcceptTcpClient();
                        LogBox.AppendText("Клиент установил соединение\r\n");
                    }
                }
                if (handler.Connected)
                {
                    //Переводим данные файла в универсальный формат чтения и записи, после в двоичный и получаем данные на клиентский совет
                    try
                    {
                        using (FileStream inputStream = File.OpenRead(filename))
                        using (NetworkStream outputStream = handler.GetStream())
                        using (BinaryWriter writer = new BinaryWriter(outputStream))
                        {
                            long lenght = inputStream.Length;
                            long totalBytes = 0;
                            int readBytes = 0;
                            byte[] buffer = new byte[2048];
 
                            writer.Write(Path.GetFileName(filename));
                            writer.Write(lenght);
 
                            do
                            {
                                readBytes = inputStream.Read(buffer, 0, buffer.Length);
                                outputStream.Write(buffer, 0, readBytes);
                                totalBytes += readBytes;
 
                            } while (handler.Connected && totalBytes < lenght);
                          LogBox.AppendText( "Файл передан\r\n");
                        }
 
                        handler.Close();
                        sListener.Stop();
                        thread.Abort();
                    }
                    catch
                    {
                       LogBox.AppendText("Файл не передан\r\n");
                    }
                }
            }
                    catch (Exception exc)
                    {
                     LogBox.AppendText(Convert.ToString(exc) + "\r\n");
                    }   
            
        }
 
                         
 
 
        //Выбор файла и извлечение его имени
        private void browseButton_Click(object sender, EventArgs e)
        {
                using (OpenFileDialog selectfile = new OpenFileDialog())
                {
                    try
                    {
                        if (selectfile.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                        {
                            LogBox.Text = "Файл выбран";
                            filename = selectfile.FileName;
                        }
                    }
                    catch
                    {
                        LogBox.Text = "Файл выбран";
                        return;
                    }
                }
            
         
        }
 
 
 
        private void Transfer_Click(object sender, EventArgs e)
        {
            if (filename != "")
            {
                {
                    if (thread.IsAlive)
                    {
                        LogBox.AppendText("Уже запущено\r\n");
                    }
                    else
                    {
                        try
                        {
                            //а если нет, запускаем, пытаемся вернее)
                            thread = new Thread(new ThreadStart(listen));
                            thread.Start();
                        }
                        catch (Exception exc)
                        {
                            LogBox.AppendText(exc + "\r\n");
                        }
                    }
                }
 
            }
            else MessageBox.Show("Выберите файл!!!");
 
        }
 
 
        private void Cancel_Click(object sender, EventArgs e)
        {
            //Если подключен клиентской сокет, отключаем его
            if (handler.Connected)
            {
                handler.Close();
                sListener.Stop();
                thread.Abort();
                LogBox.AppendText("Передача отменена\r\n");
            }
        }
 
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (handler.Connected)
            {
                handler.Close();
                sListener.Stop();
                thread.Abort();
            }
        }
    }
   }
Клиент:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        TcpClient client;
        string folder;
 
        public Form1()
        {
            InitializeComponent();
        }
 
 
        private void Cancel_Click(object sender, EventArgs e)
        {
            if (client.Connected) client.Close();
        }
   
 
        private void ReceiveFile_Click(object sender, EventArgs e)
        {
            if (folder != "")
            {
                IPEndPoint myEndpoint = new IPEndPoint(IPAddress.Loopback, 11000);
                client = new TcpClient();
                try
                {
                    //коннектимся
                    client.Connect(myEndpoint);
                    LogBox.AppendText("Подключено\r\n");
                }
                catch (Exception exc)
                {
                    LogBox.AppendText(exc + "\r\n");
                }
 
                
                if (client.Connected)
                {
                    try
                    {
                        using (NetworkStream inputStream = client.GetStream())
                        using (BinaryReader reader = new BinaryReader(inputStream))
                        {
                            string filename = reader.ReadString();
                            long lenght = reader.ReadInt64();
 
                            using (FileStream outputStream = File.Open(Path.Combine(folder, filename), FileMode.Create))
                            {
                                long totalBytes = 0;
                                int readBytes = 0;
                                byte[] buffer = new byte[2048];
 
                                do
                                {
                                    readBytes = inputStream.Read(buffer, 0, buffer.Length);
                                    outputStream.Write(buffer, 0, readBytes);
                                    totalBytes += readBytes;
 
                                } while (client.Connected && totalBytes < lenght);
                                client.Close();
                                LogBox.AppendText("Файл принят\r\n");
                            }
                        }
                    }
                    catch
                    {
                        LogBox.AppendText( "Не удалось принять файл\r\n");
                    }
                }
            }
            else MessageBox.Show("Выберите путь");
        }
 
        private void BrowseButton_Click(object sender, EventArgs e)
        {
            try
            {
                using (folderBrowserDialog1 = new FolderBrowserDialog())
                    if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
                        folder = folderBrowserDialog1.SelectedPath;
                textBox2.Text = folderBrowserDialog1.SelectedPath;
               LogBox.AppendText( "Выбран путь\r\n");
            }
            catch
            {
               LogBox.AppendText( "Не удалось выбрать путь\r\n");
                return;
            }
        }
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (client.Connected) client.Close();
        }
    }
}
0
48 / 48 / 22
Регистрация: 18.11.2013
Сообщений: 92
04.12.2013, 02:02
хм, соединять точно должно...посмотрите не прерывается ли цикл ожидающий входящее подключение (и это в нем должна быть обработка посылки файла а не снаружи: установили соединение, послали запрос, принимаем файл, закрыли соединение если надо) и еще может быть болтаются некорректно закрытые процессы вашего приложения...а стоп во первых если вы решили пользовать Abort() делайте уж while(true) но это не суть...зачем вы пытаетесь абортнуть поток из самого потока находясь блоке try{} в котором пытаетесь передать файл и который после бесконечного цикла?...короче ладно, завтра посмотрю
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
04.12.2013, 05:25
Вообще -то желательно делать как то так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using System;
using System.Net;
using System.Net.Sockets;
 
namespace CommonTransportLibrary
{
    public class SocketServer : IDisposable
    {
        public SocketServer()
        {
            ListenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        }
 
        public void Start(IPEndPoint ipEndPoint, int countClients)
        {
                ListenSocket.Bind(ipEndPoint);
                ListenSocket.Listen(countClients);
                BeginAccept();
        }
 
        private void BeginAccept()
        {
          ListenSocket.BeginAccept(AsyncCallbackAccept, null);
        }
 
        private void AsyncCallbackAccept(IAsyncResult asyncResult)
        {
            BeginAccept();
            var clientSocket = ListenSocket.EndAccept(asyncResult);
            ConnectClientEvent(this, new ConnectEventArgs(clientSocket));
            clientSocket.Disconnect(false);
        }
 
        public void Dispose()
        {
            ListenSocket.Close(ListenSocket.ReceiveTimeout);
        }
 
        Socket ListenSocket { get; set; }
        public event EventHandler<ConnectEventArgs> ConnectClientEvent = (sender, args) => { };
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
 
namespace CommonTransportLibrary
{
    public class ConnectEventArgs : EventArgs
    {
        public ConnectEventArgs(Socket client)
        {
            Client = client;
        }
 
        public Socket Client { get; set; }
    }
 
    public class SocketClient
    {
        public void Connect(IPEndPoint ipEndPoint)
        {
            using (var clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
            {
                var waitEvent = new AutoResetEvent(false);
                clientSocket.BeginConnect(ipEndPoint.Address, ipEndPoint.Port, (asyncResult) =>
                    {
                        ConnectEvent(this, new ConnectEventArgs(clientSocket));
                        if (clientSocket.Connected)
                            clientSocket.Disconnect(true);
                        waitEvent.Set();
                        clientSocket.EndConnect(asyncResult);
                    }, null);
                waitEvent.WaitOne();
            }
        }
 
        public event EventHandler<ConnectEventArgs> ConnectEvent = (sender, args) => { };
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using System;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using CommonTransportLibrary;
 
namespace TestServer
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var server = new SocketServer())
            {
                server.ConnectClientEvent += (sender, e) =>
                    {
                        Console.WriteLine("Клиент подключен!!!");
                        using (var networkStream = new NetworkStream(e.Client,FileAccess.ReadWrite))
                        {
                            var buffer = new byte[] {1, 2, 3, 4, 5};
                            Console.WriteLine("Отправка: 1, 2, 3, 4, 5");
                            networkStream.Write(buffer, 0, 5);
                            networkStream.Read(buffer, 0, 5);
                            Console.WriteLine("Прием: ");
                            buffer.ToList().ForEach(x => Console.Write("{0}, ", x));
                            Console.WriteLine();    
                        }
                    };
                server.Start(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 11000), 1000);
                Console.ReadLine();
            }
        }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using CommonTransportLibrary;
 
namespace TestClient
{
    class Program
    {
        static void Main(string[] args)
        {
            var client = new SocketClient();
            client.ConnectEvent += (sender, e) => 
            { 
                Console.WriteLine("Сервер доступен!!!");
                using (var networkStream = new NetworkStream(e.Client, FileAccess.ReadWrite))
                {
                    var buffer = new byte[5];
                    networkStream.Read(buffer, 0, 5);
                    Console.Write("Прием: ");
                    buffer.ToList().ForEach(x => Console.Write("{0}, ", x));
                    Console.WriteLine();
                    networkStream.Write(new byte[] {5, 4, 3, 2, 1}, 0, 5);
                    Console.WriteLine("Отправка: 5, 4, 3, 2, 1");
                    Console.ReadLine();
                }
            };
            client.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 11000));
        }
    }
}
Вложения
Тип файла: rar 1026286.rar (9.3 Кб, 19 просмотров)
1
48 / 48 / 22
Регистрация: 18.11.2013
Сообщений: 92
04.12.2013, 14:27
вот, убрал ненужное и допилил простой прием файла по вашей схеме
колхозный клент сервер2.zip
а теперь разбор полетов)
То что вы пытались сделать является де-факто однопоточным синхронным сервером, как он работает:
Вы включаете прослушку и ждете входящего подключения, когда клиент устанавливает соединение - сервер тут же начинает посылать ему файл и закрывает клиентский сокет (в вашем варианте еще и прослушка должна была выключиться, но я это убрал). В двух словах у такого подхода есть один большой такой минус, если нужно обработать больше 1ого клиента, 2ой и последующие клиенты будут ждать пока освободиться сервер + в вашем варианте нет никаких запросов на получение, клиент (опять же по вашей схеме) просто вынужден сразу же принять файл. Первая часть этого решается многопоточностью (тем более у вас же не однопроцессорная машина наверняка, поэтому сервер будет грузить одно ядро/поток, при этом остальные ядра будут простаивать), а конкретно для каждого входящего соединения открывать новый поток и каждый клиент обслуживается отдельно. Но когда клиентов становится оооочень много (но это в принципе не ваш случай наверно) и потоков становится слишком много, все начинает тормозить и лагать, и тут на помощь приходит асинхронная модель (товарищ выше дал вам пример именно асинхронного клиент сервера). Не буду углубляться, но в асинхронном сервере отпадает необходимость создавать хренову тучу потоков, обмен данными происходит через асинхронные колбеки.
НО, если вы хотите просто передать файл по локалке или еще что то, вы спокойно можете использовать "вашу модель", тут как говориться цель оправдывает средства)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.12.2013, 14:27
Помогаю со студенческими работами здесь

В чем может быть ошибка?
Есть такой небольшой скрипт: в файле links.txt хранятся ссылки на страницы сайтов. Скрипт ходит по этим страницам, парсит ссылки на...

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

В чём может быть ошибка?
Прога не открывает файл Дан файл f, содержащий сведения о веществах, указывается название вещества, его удельный вес и проводимость...

В чём может быть ошибка?
Всем привет! Вот 2ой день разбираюсь с CpuUsage (Qt + WinApi) Наконец-то при сборке нет ошибок Но толку мало Есть код: // // ...

В чём может быть ошибка?
Описать функцию Power4(x,a,ξ) вещественного типа (параметры х, а, ξ - вещественные, |х|&gt;1; a,ξ &gt; 0), находящую приближенное ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru