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

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

28.05.2015, 08:41. Показов 3860. Ответов 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
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru