Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 10.08.2023
Сообщений: 7

Трёхзвенка

22.01.2024, 14:11. Показов 1146. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь прожить, выходит криво, господа-коллеги, объясните, почему (к примеру) при вторичном открытии зависает форма? Или если таким же методом организовывать работу с бд - так же зависает. К сожалению, код кривой и с костылями в силу неопытности. Если есть какие-то замечания - прошу, рад буду исправлять ошибки и делать правильнее.
Код одной из форм клиента:
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
        public void Frm_tbl3_Load(object sender, EventArgs e)
        {
            TcpClient client = new TcpClient("192.168.2.25", 8080);
            DataSet data;
            NetworkStream stream = client.GetStream();
            BinaryFormatter bf = new BinaryFormatter();
            string request = "I need types";
            if (tbl_s_ctypesDataGridView.DataSource == null)
            {
 
                byte[] bytesWrite = Encoding.ASCII.GetBytes(request);
                stream.Write(bytesWrite, 0, bytesWrite.Length);
                stream.Flush();
                data = (DataSet)bf.Deserialize(stream);
                tbl_s_ctypesDataGridView.DataSource = data.Tables[0].DefaultView;
                stream.Flush();
                stream.Dispose();
                stream.Close();
                byte[] bytesForClear = new byte[4096];
                bytesWrite = bytesForClear;
                client.Dispose();
                client.Close();
            }
            this.CenterToScreen();
        }
Код сервера:
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
            //создание слушателя TCP
            var serverSocket = new TcpListener(IPAddress.Any, 8080);
 
            Console.WriteLine("Server start!");
            DataSet oscar_dataset = new DataSet();
            Connection dataBase = new Connection();
            TcpClient clientSocket = new TcpClient();
            serverSocket.Start();
 
 
                while(true)
                {
                    clientSocket = serverSocket.AcceptTcpClient();
                    NetworkStream stream = clientSocket.GetStream();
                    byte[] bytes = new byte[4096];
                    int lenght = stream.Read(bytes, 0, bytes.Length);
                    string request = Encoding.ASCII.GetString(bytes, 0, lenght);
                Console.WriteLine("Connected");
                if (!System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) return;
                var host = Dns.GetHostEntry(Dns.GetHostName());
                foreach (var ip in host.AddressList)
                {
                    if (ip.AddressFamily == AddressFamily.InterNetwork)
                    {
                        Console.WriteLine(ip.ToString());
                    }
                }
                    if (request == "I need types")
                    {
                        Console.WriteLine("We take message " + request);
                        byte[] GetByteDataSet(DataSet data)
                        {
                            //создали поток, используемый для сериализации в качестве временного буфера
                            MemoryStream mem_streem = new MemoryStream();
                            //объект, выполняющий сериализацию
                            BinaryFormatter bin_format = new BinaryFormatter();
 
                            //собственно сама сериализация из DataSet в MemoryStreem
                            bin_format.Serialize(mem_streem, data);
                            //создали буфер для переконвертированного DataSet
                            //перевели в массив byte[]
                            byte[] data_rez = mem_streem.ToArray();
 
                            //обрубили поток
                            mem_streem.Close();
                            mem_streem.Dispose();
 
 
                            return data_rez;
                        }
                        DataSet typesDA = new DataSet();
                        DataTable TypesDT = new DataTable("Types");
                        dataBase.openConnection();
                        SqlDataAdapter da3 = new SqlDataAdapter("select id_type, ctype_name from tbl_s_ctypes", dataBase.getConnection());
                        da3.TableMappings.Add("Table3", "Types");
                        da3.Fill(TypesDT);
                        typesDA.Tables.Add(TypesDT);
                        NetworkStream client_streem = clientSocket.GetStream();
                        client_streem.Write(GetByteDataSet(typesDA), 0, GetByteDataSet(typesDA).Length);
                        Console.WriteLine("Client got table Types");
 
                        Console.WriteLine("We have bytes " + Encoding.ASCII.GetString(bytes, 0, lenght));
                        byte[] bytesForClear = new byte[4096];
                        bytes = bytesForClear;
                        Console.WriteLine("Clear bytes " + Encoding.ASCII.GetString(bytes, 0, lenght));
 
                        Console.WriteLine("Получены данные из таблицы");
                        foreach (DataRow r in TypesDT.Rows)
                        {
 
                            foreach (var cell in r.ItemArray)
                                Console.Write("\t{0}", cell);
                            Console.WriteLine();
                        }
                        Console.Read();
                        client_streem.Dispose();
                        Console.ReadLine();
                    }
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.01.2024, 14:11
Ответы с готовыми решениями:

Трехзвенка на Java
Пишу на Java интерфейс к БД oracle, хочу сделать 3-х звенку, просто через jdbc уже с базой поработал, теперь хочется, что-бы клиент был...

Трехзвенка и транзакции
Всем привет, просветите кто знает (понимает суть процессов) В трехзвенной модели - (тонкий клиент - сервер приложений -...

Трехзвенка: DAX error
При запуске клиента в трехзвенной структуре (Delphi 6) возникает ошибка : 'DAX error: Non unique name in this context'. Пожалуйста,...

3
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
23.01.2024, 12:31
Лучший ответ Сообщение было отмечено YourDeath как решение

Решение

1. Не используется using, вместо этого натыкиваются Close/Dispose (ещё и в неправильном порядке)
2. BinaryFormatter не является секьюрной сериализацией. Для сетевого кода это плохой подход, так как обычно подразумевается что источник не является доверенным.
3. Использование DataSet в качестве передаваемого объекта -- тоже плохо. Во-первых он вроде как не сериализируемый по определению. Во-вторых всегда нужно объявлять отдельный контракт, который занимается только доставкой данных и ничем более, завязыватся на внутренню логику -- плохо.
4. request = "I need types" -- шляпа. Опечататься в тексте легко, и компилятор по этому поводу не среагирует. Пихайте просто какой-то объект, это в сотню раз лучше. Даже если так -- в контракте (он обычно идет отдельной общей либой) объявляется отдельная константа, чтобы упростить себе жизнь (легко понять по коду к чему это) и исключить опечатки.
5. while (true) -- нужна коректная остановка. Все бесконечные циклы идут в туже топку, куда и goto.
6. int lenght = stream.Read(bytes, 0, bytes.Length); -- сюда абсолютно спокойно может прилететь пол строки. Возмите за правило что запихивая в поток любого размера пакет, по факту он может раздробить хоть по одному(!) байту. На практике конечно такое не случается, но построеный по такому принципу код -- самый надежный. (Тольно не считывайте побайтно. Просто вводите принцип передачи, который умеет понимать что считались все данные).
7. bin_format.Serialize(mem_streem, data); -- сериализовать можно сразу в networkStream.
0
0 / 0 / 0
Регистрация: 10.08.2023
Сообщений: 7
23.01.2024, 12:57  [ТС]
Wolfdp, многое, если честно, не совсем понял. У вас случаем нет примера подобного кода с БД? Серфил интернет - везде информация кусками, и то, по вашим словам - не совсем правильная, плюс лепил от себя. Думаю, не я один столкнулся с этой проблемой, может какие люди так же увидят
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
23.01.2024, 13:37
Цитата Сообщение от YourDeath Посмотреть сообщение
У вас случаем нет примера подобного кода с БД?
нет, и набирать его довольно долго и муторно. Плюс если вы сейчас спотыкаетесь об using, то мой код вам мало чем поможет, а специально писать "по простому" на самом деле очень сложно, долго и скучно.

Цитата Сообщение от YourDeath Посмотреть сообщение
Серфил интернет - везде информация кусками
Если пытаетесь в программирование, то придется учиться понимать инфу кусками и собирать в единое целое. Более того, ООП подразумевает что код не идет единым монолитом, а у вас есть отдельный кусок/модуль/класс отвечающий только за работу с БД, отдельно логика за сеть и т.д. Это радикально упрощает работу с проектом.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.01.2024, 13:37
Помогаю со студенческими работами здесь

Клиент-серверное приложение и трехзвенка
Не попадалось ли кому сравнительной характеристики этих двух архитектур?

Трехзвенка (DCOM). Какие хорошие книги или линки ?
Посоветуйте хорошую книгу или линк с толковыми примерами на трехзвенку.


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru