Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
 Аватар для Talkoflights
25 / 25 / 17
Регистрация: 23.09.2012
Сообщений: 274

Клиент-серверное приложение по Интернету с динамическим IP

28.05.2015, 08:41. Показов 3959. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Имеются следующие клиент и сервер, которые я пытаюсь "подружить" через Интернет:
Клиент.
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
namespace ClientTest
{
    internal class Program
    {
        private static TcpClient client;
        private static NetworkStream stream;
        private static void Main(string[] args)
        {
            string temp;
            client = new TcpClient("IP сервера",5052);
            stream = client.GetStream();
            Console.WriteLine(client.SendBufferSize);
 
            while ((temp = Console.ReadLine()) != "exit")
            {
                Send(temp);
            }
 
            SendFile(new FileInfo(@"File_path"));
            Console.ReadKey(true);
        }
 
        public static void SendFile(FileInfo file)
        {
            byte[] id = BitConverter.GetBytes((ushort)1);
            byte[] size = BitConverter.GetBytes(file.Length);
            byte[] fileName = Encoding.UTF8.GetBytes(file.Name);
            byte[] fileNameLength = BitConverter.GetBytes((ushort)fileName.Length);
            byte[] fileInfo = new byte[12 + fileName.Length];
 
            id.CopyTo(fileInfo, 0);
            size.CopyTo(fileInfo, 2);
            fileNameLength.CopyTo(fileInfo, 10);
            fileName.CopyTo(fileInfo, 12);
 
            stream.Write(fileInfo, 0, fileInfo.Length); //Размер файла, имя
 
            byte[] buffer = new byte[1024 * 32];
            int count;
 
            long sended = 0;
 
            using (FileStream fileStream = new FileStream(file.FullName, FileMode.Open))
                while ((count = fileStream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    stream.Write(buffer, 0, count);
                    sended += count;
                    Console.WriteLine("{0} bytes sended.", sended);
                }
            stream.Flush();
        }
 
 
        private static void Send(string message)
        {
            byte[] id = BitConverter.GetBytes((ushort)0);
            byte[] msg = Encoding.UTF8.GetBytes(message);
            byte[] msgLength = BitConverter.GetBytes((ushort)msg.Length);
            byte[] fileInfo = new byte[12 + msg.Length];
 
            id.CopyTo(fileInfo, 0);
            msgLength.CopyTo(fileInfo, 10);
            msg.CopyTo(fileInfo, 12);
 
            stream.Write(fileInfo, 0, fileInfo.Length);
            stream.Flush();
        }
    }
}
Сервер.
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
namespace Server_Test
{
    class Server
    {
        static void Main(string[] args)
        {
            Server serv = new Server();
            serv.ListenForClients();
 
        }
        private TcpListener listener { get; set; }
        private NetworkStream stream { get; set; }
 
        public Server()
        {
            listener = new TcpListener(IPAddress.Parse("192.168.1.2"), 5052);
            listener.Start();
            new Thread(ListenForClients).Start();
        }
 
        private void ListenForClients()
        {
            while (true)
            {
                TcpClient client = this.listener.AcceptTcpClient();
                new Thread(HandleClient).Start(client);
            }
        }
 
        private void HandleClient(object tcpClient)
        {
            TcpClient client = (TcpClient)tcpClient;
            while (client.Connected)
            {
                Recieve(client);
            }
        }
 
        private void Recieve(TcpClient client)
        {
            byte[] buffer = new byte[client.ReceiveBufferSize];
            try
            {
                stream = client.GetStream();
                int bytesRead = stream.Read(buffer, 0, 12);
                if (bytesRead == 0) return;
 
                ushort id = BitConverter.ToUInt16(buffer, 0);
                long len = BitConverter.ToInt64(buffer, 2);
                ushort nameLen = BitConverter.ToUInt16(buffer, 10);
                stream.Read(buffer, 0, nameLen);
                string fileName = Encoding.UTF8.GetString(buffer, 0, nameLen);
 
                if (id == 1)
                {
                    using (BinaryWriter writer = new BinaryWriter(new FileStream(fileName, FileMode.Create)))
                    {
                        int recieved = 0;
                        while (recieved < len)
                        {
                            bytesRead = stream.Read(buffer, 0, client.ReceiveBufferSize);
                            recieved += bytesRead;
                            writer.Write(buffer, 0, bytesRead);
                            Console.WriteLine("{0} bytes recieved.", recieved);
                        }
                    }
                    Console.WriteLine("File length: {0}", len);
                    Console.WriteLine("File Name: {0}", fileName);
                    Console.WriteLine("Recieved!");
                }
                else
                {
                    Console.WriteLine(fileName);
                }
            }
            catch (Exception)
            {
                stream.Close();
                client.Close();
            }
            finally
            {
                stream.Flush();
            }
        }
    }
 
}
Проблема в том, что при попытке соединения на стороне клиента выдается ошибка:
"Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера".
С чем может быть связано?
Заранее спасибо за ответы.

Добавлено через 58 минут
Собственно, ошибку выбивает на
C#
1
client = new TcpClient("IP сервера",5052);
При этом ошибка выдается только при попытке использовать приложение для коннекта через Интернет, если машины объединить в локальную сеть, все работает нормально.
Связано ли это с портами?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.05.2015, 08:41
Ответы с готовыми решениями:

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

Клиент-серверное приложение. Сервер - ПК, клиент - телефон (Android)
Здравствуйте, решил для обучения написать программу для выключения ПК с телефона, используя компонент TIdTCPServer. Подскажите, как...

Клиент-серверное приложение: как определить, что сервер/клиент не отвечает в течении определенного времени
Пишу клиент-серверное приложение. Использую TCPListener и TCPClient. Вопрос: как определить что сервер(клиент) не отвечает в течении...

21
 Аватар для Talkoflights
25 / 25 / 17
Регистрация: 23.09.2012
Сообщений: 274
29.05.2015, 05:20  [ТС]
Студворк — интернет-сервис помощи студентам
Rius, с горем пополам смог в передачу одновременно одного файла.
Сейчас пытаюсь с клиента передать на сервер два файла одновременно, и испытываю при этом некоторые проблемы.
Вот код:
Клиент:
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Net.Sockets;
using System.IO;
using System.Net;
 
namespace ClientTest
{
internal class Program
{
private static TcpClient client;
private static NetworkStream stream;
private static void Main(string[] args)
{
string temp;
client = new TcpClient("192.168.1.2",5052);
//stream = client.GetStream();
Console.WriteLine(client.SendBufferSize);
/*while ((temp = Console.ReadLine()) != "exit")
{
Send(temp);
}*/
 
Thread one=new Thread(()=> SendFile(new FileInfo(@"1.doc")));
one.Start();
Thread two=new Thread(()=> SendFile(new FileInfo(@"2.docx")));
two.Start();
// Console.ReadKey(true);
}
 
public static void SendFile(FileInfo file)
{
stream = client.GetStream();
stream.Flush();
byte[] id = BitConverter.GetBytes((ushort)1);
byte[] size = BitConverter.GetBytes(file.Length);
byte[] fileName = Encoding.UTF8.GetBytes(file.Name);
byte[] fileNameLength = BitConverter.GetBytes((ushort)fileName.Length);
byte[] fileInfo = new byte[12 + fileName.Length];
 
id.CopyTo(fileInfo, 0);
size.CopyTo(fileInfo, 2);
fileNameLength.CopyTo(fileInfo, 10);
fileName.CopyTo(fileInfo, 12);
 
stream.Write(fileInfo, 0, fileInfo.Length); //Размер файла, имя
 
byte[] buffer = new byte[1024 * 32];
int count;
 
long sended = 0;
 
using (FileStream fileStream = new FileStream(file.FullName, FileMode.Open))
while ((count = fileStream.Read(buffer, 0, buffer.Length)) > 0)
{
stream.Write(buffer, 0, count);
sended += count;
Console.WriteLine("{0} bytes sended.", sended);
}
stream.Flush();
Array.Clear(buffer, 0, buffer.Length);
}
 
private static void Send(string message)
{
byte[] id = BitConverter.GetBytes((ushort)0);
byte[] msg = Encoding.UTF8.GetBytes(message);
byte[] msgLength = BitConverter.GetBytes((ushort)msg.Length);
byte[] fileInfo = new byte[12 + msg.Length];
 
id.CopyTo(fileInfo, 0);
msgLength.CopyTo(fileInfo, 10);
msg.CopyTo(fileInfo, 12);
stream.Write(fileInfo, 0, fileInfo.Length);
stream.Flush();
 
}
}
}
Сервер:
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Net.Sockets;
using System.IO;
using System.Net;
 
namespace Server_Test
{
    class Server
    {
        static void Main(string[] args)
        {
            Server serv = new Server();
        }
        private TcpListener listener { get; set; }
        private NetworkStream stream { get; set; }
 
        public Server()
        {
            listener = new TcpListener(IPAddress.Parse("192.168.1.2"), 5052);
            listener.Start();
            new Thread(ListenForClients).Start();
        }
 
        private void ListenForClients()
        {
            while (true)
            {
                TcpClient client = this.listener.AcceptTcpClient();
                new Thread(HandleClient).Start(client);
            }
        }
 
        private void HandleClient(object tcpClient)
        {
            TcpClient client = (TcpClient)tcpClient;
            while (client.Connected)
            {
                
                Recieve(client);
            }
        }
 
        private void Recieve(TcpClient client)
        {
            byte[] buffer = new byte[client.ReceiveBufferSize];
            Array.Clear(buffer, 0, buffer.Length);
            try
            {
                stream = client.GetStream();
                stream.Flush();
                int bytesRead = stream.Read(buffer, 0, 12);
                if (bytesRead == 0) return;
 
                ushort id = BitConverter.ToUInt16(buffer, 0);
                long len = BitConverter.ToInt64(buffer, 2);
                ushort nameLen = BitConverter.ToUInt16(buffer, 10);
                stream.Read(buffer, 0, nameLen);
                string fileName = Encoding.UTF8.GetString(buffer, 0, nameLen);
 
                if (id == 1)
                {
                    using (BinaryWriter writer = new BinaryWriter(new FileStream(fileName, FileMode.Create)))
                    {
                        int recieved = 0;
                        while (recieved < len)
                        {
                            bytesRead = stream.Read(buffer, 0, client.ReceiveBufferSize);
                            recieved += bytesRead;
                            writer.Write(buffer, 0, bytesRead);
                            Console.WriteLine("{0} bytes recieved.", recieved);
                        }
                    }
                    Console.WriteLine("File length: {0}", len);
                    Console.WriteLine("File Name: {0}", fileName);
                    Console.WriteLine("Recieved!");
                    stream.Flush();
                    Array.Clear(buffer, 0, buffer.Length);
                }
                else
                {
                    Console.WriteLine(fileName);
                }
            }
            catch (Exception ex)
            {
 
                stream.Close();
                client.Close();
                Console.WriteLine(ex);
            }
            finally
            {
                stream.Flush();
                Array.Clear(buffer, 0, buffer.Length);
            }
        }
    }
}
Выдает ошибку на 61-ой строке(сервер).
Недопустимое значение 3-го параметра Stream.Read(Byte[] buffer, int32 offset, int32 size). Выход за пределы значений.
Пробовал все, танцевал с бубном-без толку.

Добавлено через 1 час 31 минуту
Если в общем, то вопрос стоит так-как организовать передачу нескольких файлов с одно клиента на сервер?

Добавлено через 2 часа 4 минуты
Наверное, вынесу я это в отдельную тему.
0
16 / 16 / 4
Регистрация: 20.05.2015
Сообщений: 37
03.06.2015, 03:34
IPAddress.Parse("192.168.1.2"), 5052); тут должен быть внешний IP сервера (IP в интернете)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.06.2015, 03:34

Клиент серверное приложение
Ребят вообщем нужно написать клиент серверное приложение в консоле. Как писать с чего начать понятия не имею, программу не прошу что-бы...

Клиент-Серверное приложение на C#
Доброго времени суток. Возможно я буду не первым кто задает подобны вопрос, но все же: подскажите хорошую литературу с примерами, по...

Клиент-Серверное приложение
Здравствуйте, есть программа на Delphi 7, работающая с БД MS Access.. В БД есть таблицы. Вот в чем вопрос, надо переделать эту БД для...

Клиент-серверное приложение
Всем привет сразу о главном перехожу к обучению клиент-серверный программ в частности Баз-данных, незнаю с чего начать разработку буду...

Клиент-серверное приложение
Здравствуйте. Начал писать клиент-серверное приложение, вернее начал задумываться над тем как его писать. Вчера полазив по форумам и...


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

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru