Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2015, 12:55   #1
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию Скоординировать 2 класса

У меня есть класс самой формы Windows Forms FormM, и класс TCP-клиента AsynchronousClient, сервер к нему я уже давно скомпилировал и запускаю отдельно. Итак, начнем.

Код:
private void button1_Click(object sender, EventArgs e)
        {
            tmr.Enabled = !tmr.Enabled;
            button1.Text = tmr.Enabled ? "Стоп" : "Старт";
            button1.ForeColor = tmr.Enabled ? Color.Green : Color.DarkRed;
 
            AsynchronousClient myClass = new AsynchronousClient();
            myClass.StartClient();
 
            B.Clear(); Bdig.Clear(); difcod.Clear(); Ipart.Clear(); Qpart.Clear();
            itmr = 1; nSymbol = 1; 
 
            A = richTextBox1.Text;      //Исходное сообщение
            for (int i = 0; i < A.Length; i += 225)
            {
                B.Add(((A.Length - i) < 225) ? A.Substring(i).PadRight(225, '\0') : A.Substring(i, 225));
                nSymbol++;
            }
        }
Как видно, она вызывает функцию с класса AsynchronousClient, которая отвечает за TCP. дальше в классе FormM происходит работа по таймеру - каждые 500 мс генерируются новые массивы данных:

Код:
void tmr_Tick(object sender, EventArgs e) { }
Здесь-то я и получаю злосчастную Ipart, которая должна оказываться в классе AsynchronousClient после каждого ее обновления.

Код:
public class AsynchronousClient
    {
        
        public static string Ipart = "";
        // The port number for the remote device.
        const int port = 11000;
        // ManualResetEvent instances signal completion.
        static System.Threading.ManualResetEvent connectDone =
            new System.Threading.ManualResetEvent(false);
        static System.Threading.ManualResetEvent sendDone =
            new System.Threading.ManualResetEvent(false);
        static System.Threading.ManualResetEvent receiveDone =
            new System.Threading.ManualResetEvent(false);
 
 
        // The response from the remote device.
        static String response = String.Empty;
 
        public void StartClient()
        {
            // Connect to a remote device.
            try
            {
                // Establish the remote endpoint for the socket.
                // The name of the 
                // remote device is "host.contoso.com".
                IPHostEntry ipHostInfo = Dns.Resolve("localhost");
                IPAddress ipAddress = ipHostInfo.AddressList[0];
                IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);
 
                // Create a TCP/IP socket.
                Socket client = new Socket(AddressFamily.InterNetwork,
                    SocketType.Stream, ProtocolType.Tcp);
 
                // Connect to the remote endpoint.
                client.BeginConnect(remoteEP,
                    new AsyncCallback(ConnectCallback), client);
                connectDone.WaitOne();
                Ipart = "582721278981293123129381923<EOF>";
                Ipart = FormM.Ipart[0] + "<EOF>";
                string ssss = "";
                // Send test data to the remote device.
                Send(client, Ipart);
                sendDone.WaitOne();
Здесь-то и ломается моя логика. При запуске такого кода предварительно запущенный сервер вылетает. Я даже не могу посмотреть в режиме отладки, как принялась Ipart, потому что лаги начинаются именно на этой строчке. Отмечу, что если в классе TCP-клиента указать конкретно string Ipart = "sasfdasfqefc<EOP>", то все шикарно, сервер принимает это сообщение. А тут, видимо, нужно что-то менять.

А как сделать мне тогда, чтобы при нажатии на кнопку происходили некоторые действия, и как я только получил значение переменной Ipart, я мог их сразу же передать по TCP? Как можно доработать мой код?
Krasi вне форума Ответить с цитированием
Старый 28.10.2015, 13:01   #2
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Наверное, просто запихать старт клиент из баттона в таймер?
Krasi вне форума Ответить с цитированием
Старый 28.10.2015, 13:18   #3
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Половина вопроса решена. Просто запихал в таймер. Но теперь другая проблема. В TCP я хочу передавать сразу две переменные. ну я и написал
Код:
public void StartClient()
        {
            // Connect to a remote device.
            try
            {
                // Establish the remote endpoint for the socket.
                // The name of the 
                // remote device is "host.contoso.com".
                IPHostEntry ipHostInfo = Dns.Resolve("localhost");
                IPAddress ipAddress = ipHostInfo.AddressList[0];
                IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);

                // Create a TCP/IP socket.
                Socket client = new Socket(AddressFamily.InterNetwork,
                    SocketType.Stream, ProtocolType.Tcp);

                // Connect to the remote endpoint.
                client.BeginConnect(remoteEP,
                    new AsyncCallback(ConnectCallback), client);
                connectDone.WaitOne();

                Ipart = Ipart + "<EOF>";
                // Send test data to the remote device.
                Send(client, Ipart);
                sendDone.WaitOne();

                Send(client, Ipart);
                sendDone.WaitOne();
...
Почему сервер и клиент зависли? Добавил всего лишь второй раз передачу Ipart. Может в клиенте надо что-то менять? Если не писать второй раз Send(client, Ipart);
sendDone.WaitOne();, то все работает, а так почему-то нет... ?!

Последний раз редактировалось Krasi; 28.10.2015 в 14:33.
Krasi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов конструктора производного класса для экземпляра базового класса max_prorok Помощь студентам 5 09.09.2015 09:39
C++ - Как получить доступ к методам класса, который содержится в векторе класса Disabled7 Общие вопросы C/C++ 1 14.06.2015 10:19
Не понятная проблема, адрес переменной класса у 2 объектов класса одинаков Soeth Общие вопросы C/C++ 8 06.11.2013 05:10
Конструктор класса не хочет принимать в качестве параметра адрес объекта другого класса Jugger Помощь студентам 3 05.01.2012 04:10
Определение типа класса по переменной на объект этого класса при компиляции phomm Общие вопросы Delphi 24 08.04.2011 14:11