Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
1 / 1 / 2
Регистрация: 28.08.2014
Сообщений: 68
1

Проверьте правильность кода сетевого приложения и исправьте ошибки, если таковые имеются

28.08.2014, 14:00. Показов 1520. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени.

В общем начал программировать на C# ровно 2 часа назад . Уровень моих знаний естественно равен нулю. Но тем не менее поковырявшись в примерах я выполнил необходимую мне задачу:

Есть форма на ней кнопка, по нажатию кнопки на определённый IP и на определённый порт (внутри сети) передаётся сообщение "Hello". На другом конце слушатель принимает сообщение и реагирует на него (слушатель - программа стороннего разработчика).

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

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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Net.Sockets;
 
namespace WindowsFormsApplication1
{
 
        
        public partial class Form1 : Form
        {
            private const int EhcoPort = 10001;
            TcpClient eClient = new TcpClient("192.168.1.10", EhcoPort);
 
            string datatoSend;
            public Form1()
            {
                InitializeComponent();
            }
 
            private void button1_Click(object sender, EventArgs e)
            {
                StreamReader readerStream = new StreamReader(eClient.GetStream());
                NetworkStream writerStreem = eClient.GetStream();
 
                datatoSend = "Hello";
                byte[] data = Encoding.ASCII.GetBytes(datatoSend);
                writerStreem.Write(data, 0, data.Length);
                eClient.Close();
            }
        }
  
    }
p.s. Мне нет необходимости досконально изучать C#, нужен просто примитивный интерфейс с описанной выше задачей. Поэтому прошу, не обвиняйте в лени и нежелании досконально изучить С#, всему своё время, но сейчас это нецелесообразно. Поэтому войдите в положение. Спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.08.2014, 14:00
Ответы с готовыми решениями:

Первый class Array. Проверить и указать на ошибки, если таковые имеются
Доброго всем времени суток!Осмелюсь показать свой первый class Array.Код работает."заточен" он на...

Удалить из списка L все элементы E, если таковые имеются
Ребят, помогите пожалуйста решить очень интересное задание!) На Си либо С++ составить программу...

Удалить из списка L все элементы Е, если таковые имеются
Всем добрый день, пожалуйста, помогите с задачей, вообще не понятно: Дан список L, состоящий из...

Найти сокращенную, минимальную, тупиковую, КН форму F, если таковые имеются
Найдите КНФ F. Явл ли F тавтологией? Найдите сокращенную, минимальную, тупиковую, КН форму F,...

7
870 / 720 / 304
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
28.08.2014, 14:29 2
Lazebin,
StreamReader тоже нужно закрывать, или оборачивать в using
C#
1
2
3
4
5
6
7
8
9
            using (StreamReader readerStream = new StreamReader(eClient.GetStream()))
            {
                using(NetworkStream writerStreem = eClient.GetStream())
                {
                    datatoSend = "Hello";
                    byte[] data = Encoding.ASCII.GetBytes(datatoSend);
                    writerStreem.Write(data, 0, data.Length);
                }
            }
1
foo();
886 / 587 / 222
Регистрация: 03.07.2013
Сообщений: 1,549
Записей в блоге: 2
28.08.2014, 14:30 3
Lazebin, сразу признаюсь, в TCP я НЕ силен. Заметил, что eClient используется в программе неоднократно, а Вы его закрываете сразу после первого использования (36 строка). readerStream вообще не используется. А writerStream вы как раз не закрываете, хоть и создаете новый каждый раз. Если я все правильно понял, Вам нужно строку 30 убрать, а 36 заменить на
C#
1
writerStream.Close();
Надеюсь я правильно понял в чем ошибка, но было бы хорошо, если бы вы показывали полное сообщение об исключении в программе.
1
1 / 1 / 2
Регистрация: 28.08.2014
Сообщений: 68
28.08.2014, 16:36  [ТС] 4
Спасибо, господа, сейчас попробую.

Добавлено через 1 час 35 минут
В общем всё плохо, я избавился от readerStream совсем, а writerStreem заключил в using, попытался использовать writerStream.Close(), на что он вообще руганулся.
В общем при первом нажатии на кнопку - всё пучком при повторном во что получается:

Проверьте правильность кода сетевого приложения и исправьте ошибки, если таковые имеются
0
91 / 90 / 37
Регистрация: 05.08.2011
Сообщений: 428
28.08.2014, 17:25 5
Lazebin, Скорее всего из за строки:
C#
1
eClient.Close()
Попробуйте убрать её. Или перед using(NetworkStream... , дописать:
C#
1
eClient.Connect();
1
122 / 120 / 47
Регистрация: 14.09.2012
Сообщений: 276
28.08.2014, 21:14 6
Лучший ответ Сообщение было отмечено Lazebin как решение

Решение

попробуйте так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void button1_Click(object sender, EventArgs e)
{
    TcpClient eClient = new TcpClient();
    eClient.Connect("192.168.1.10", EhcoPort);
    
    using (StreamReader readerStream = new StreamReader(eClient.GetStream()))
    {
        using(NetworkStream writerStreem = eClient.GetStream())
        {
            datatoSend = "Hello";
            byte[] data = Encoding.ASCII.GetBytes(datatoSend);
            writerStreem.Write(data, 0, data.Length);
        }
    }
    eClient.Close();
}
или просто не закрывайте соединение в конце
1
1 / 1 / 2
Регистрация: 28.08.2014
Сообщений: 68
30.08.2014, 10:48  [ТС] 7
ablai96, спасибо большое, всё заработало, отклик изумительный, теперь сижу разбираюсь - что к чему.

И вообще, всем спасибо, ребята, кто проявил участие!



Добавлено через 26 минут
Теперь если можно вопрос не по теме, хотя как знать...

Насколько я понял: StreamReader используется для получения ответа от сервера/клиента, нужен ли он вообще в данном коде? (ну по идее он мне потом понадобится но не именно в реакции по кнопке)

И второй вопрос: Опять же, судя по коду, соединение открывается прямо в момент нажатия кнопки, выполняется отправка сообщения и, далее соединение закрывается. Если в будущем я предполагаю написать интерфейс с набором кнопок разного назначения, которые будут отсылать различные сообщения на один и тот же адрес и один и тот же порт - то, целесообразно ли постоянное открытие и закрытие соединения, экономит ли подобное действие процессорный и сетевой "ресурс"? Либо, было бы логичнее не закрывать соединение до закрытия формы и уменьшит ли это время отклика?

Ну и третий вопрос: серверу абсолютно всё равно, в каком формате я отсылаю сообщение, по сути, на данном этапе я отсылаю текстовые, которые преобразую в "byte", и на основе полученного сообщения сервер выполняет определённую программу. Мне кажется, я делаю лишние "телодвижения". Оно конечно удобнее видеть команду в коде которая доберётся до сервера, а не просто "byte", но опять же насколько это целесообразно для оптимизации кода?

Фух... других загрузил и сам загрузился

Спасибо.
0
91 / 90 / 37
Регистрация: 05.08.2011
Сообщений: 428
30.08.2014, 12:57 8
Цитата Сообщение от Lazebin Посмотреть сообщение
Насколько я понял: StreamReader используется для получения ответа от сервера/клиента, нужен ли он вообще в данном коде? (ну по идее он мне потом понадобится но не именно в реакции по кнопке)
StreamReader у вас действительно не используется. Лично я его применения в данном коде не вижу, считывание происходит через NetworkStream.
Цитата Сообщение от Lazebin Посмотреть сообщение
Если в будущем я предполагаю написать интерфейс с набором кнопок разного назначения, которые будут отсылать различные сообщения на один и тот же адрес и один и тот же порт - то, целесообразно ли постоянное открытие и закрытие соединения, экономит ли подобное действие процессорный и сетевой "ресурс"? Либо, было бы логичнее не закрывать соединение до закрытия формы и уменьшит ли это время отклика?
Время отклика должно уменьшиться при постоянном соединении, это логично. На счет экономии ресурсов - не знаю...
Цитата Сообщение от Lazebin Посмотреть сообщение
по сути, на данном этапе я отсылаю текстовые, которые преобразую в "byte", и на основе полученного сообщения сервер выполняет определённую программу.
Хмм, сейчас специально посмотрел, у метода NetworkStream.Write - нет перегрузки, где отправляется стринговая переменная, если Вы найдете способ отправлять строку сразу и сервер не будет говорить Вам ошибок, то проблем нет)) Да и вообще информация по интернету передается в виде "0" и "1", в конечном итоге где-то происходит это преобразование.
P.S. суперпуперзнатоки просьба не пинать, если где-то не прав, я только учусь.
0
30.08.2014, 12:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.08.2014, 12:57
Помогаю со студенческими работами здесь

найти точки пересечения (если таковые имеются) параболы(парабола любая)
найти точки пересечения (если таковые имеются) параболы(парабола любая) с осями координат, вывести...

Составить программу, которая удаляет из списка L все элементы E, если таковые имеются.
Помогите с задачей: Составить программу, которая удаляет из списка L все элементы E, если таковые...

Есть ли в массиве нулевые элементы и, если таковые имеются, вывести номер первого из найденных
Дан одномерный массив. Определить, есть ли в массиве нулевые элементы и, если таковые имеются,...

Массив: Заменить нулем все элементы этой матрицы, равные x, если таковые имеются.
Даны натуральные числа n и m, определяющие соответственно количество строк и столбцов в некоторой...

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

Проверьте правильность кода)
задача:Даны действительное число а, натуральное число n. Вычислить: S = 1/a + 1/a^2 + 1a^4 + … +...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru