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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2015, 11:19   #11
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Чем это лучше таймера?
Что лучше таймера? Поток??
Ты сам смысл прослушки порта понимаешь?
Тебе нужно вызвать некую функцию, которая при запуске ждет когда в порт сокета.
При этом ожиданте конечно же заморозит поток, если это блокирующий сокет без проверки на таймаут и т.д.
Как тебе поможет в этом случае таймер?
тебе бы сначала стоит почитать про сокеты. Блокирующие и неблокирующие. Как они устроены и как с ними работать.
Основная схема: Доппоток, в котором в бесконечном цикле вызывается функция прослушки. Если в порт приходят данные функция возвращает сокет, подвязанный к этим данным, и уже из этого сокета ты делаешь считку, пока сокет не опустеет. А дальше опять итерация цикла, которая далее ждет прослушивая.
Таймер тут никак не помошник.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.11.2015, 14:12   #12
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Так у меня-то задача сделать такой TCP, чтобы в этой же программе по циклу обрабатывались и мои данные. Вот и вопрос - как сделать программу по циклу? Я почитал, что Вы скинули, понял, что это именно для того, чтобы один поток постоянно поддерживал связь с сервером, а второй поток делал то, что мне надо, это так? Также я смогу сделать и сервер, чтобы один поток постоянно слушал, что идет на IP:PORT, а второй работал с тем же таймером, например. Да?

Ну вот и пробую структуру программы Вам предложить, как я ее понял. А сам пока читаю блокирующие и неблокирующие сокеты

Самое-то главное, вроде в теории там ничего сложного, почитал я про все это дело, но я один еще долго двух строчек сложить не смогу

Код:
 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            tmr.Enabled = !tmr.Enabled;
            button1.Text = tmr.Enabled ? "Стоп" : "Старт";
            button1.ForeColor = tmr.Enabled ? Color.Green : Color.DarkRed;
            generate();   
        }

    public void generate()
        { 

Thread thread1 = new Thread(
                   new ThreadStart(() =>
                   {timer_tick();
//Здесь другие алгоритмы, для получения Iout и Qout}));

Thread thread2 = new Thread(
                   new ThreadStart(() =>
                   {AsynchronousClient.Ipart = Iout[itmr - 1];
            AsynchronousClient.Qpart = Qout[itmr - 1];
            AsynchronousClient myClass = new AsynchronousClient();
            myClass.StartClient();}));

   }

pulbic void timer_tick() {}
Может, так?

Последний раз редактировалось Stilet; 03.11.2015 в 15:06.
Krasi вне форума Ответить с цитированием
Старый 03.11.2015, 15:09   #13
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Я почитал, что Вы скинули, понял, что это именно для того, чтобы один поток постоянно поддерживал связь с сервером, а второй поток делал то, что мне надо, это так?
В случае с клиентом никаких потоков не надо.
Поток нужен серверу, который будет слушать порт.
Ты пишешь клиента или сервер?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.11.2015, 15:17   #14
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

И то, и то. Но клиент-то работает, а я вот про это и не понял, что может оптимальнее таймер и с клиента убрать. Тогда не понял, если пишу сервер, то код у меня такой
Где тут что на потоки-то разбивать? Может, я плохо прочитал еще, но что-то не дошло до меня;(
Krasi вне форума Ответить с цитированием
Старый 03.11.2015, 15:17   #15
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace NEWSERV
{



    public class StateObject
    {
        // Client  socket.
        public Socket workSocket = null;
        // Size of receive buffer.
        public const int BufferSize = 2048;

        public byte[] buffer = new byte[BufferSize];
  
        public StringBuilder sb = new StringBuilder();
    }

    public class AsynchronousSocketListener
    {
        // Thread signal.
        public static ManualResetEvent allDone = new ManualResetEvent(false);

        public AsynchronousSocketListener()
        {
        }

        public static void StartListening()
        {
            // Data buffer for incoming data.
            byte[] bytes = new Byte[2048];

            // Establish the local endpoint for the socket.
            // The DNS name of the computer
            // running the listener is "host.contoso.com".
            IPHostEntry ipHostInfo = Dns.Resolve("localhost");//Dns.Resolve(Dns.GetHostName());
            IPAddress ipAddress = ipHostInfo.AddressList[0];
            IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);


            Socket listener = new Socket(AddressFamily.InterNetwork,
                SocketType.Stream, ProtocolType.Tcp);

          
            try
            {
                listener.Bind(localEndPoint);
                listener.Listen(100);

                while (true)
                {

                    allDone.Reset();

                    Console.WriteLine("Waiting for a connection...");
                    listener.BeginAccept(
                        new AsyncCallback(AcceptCallback),
                        listener);

 
                    allDone.WaitOne();
                }

            }
        

            Console.WriteLine("\nPress ENTER to continue...");
            Console.Read();

        }

        public static void AcceptCallback(IAsyncResult ar)
        {
            // Signal the main thread to continue.
            allDone.Set();

            // Get the socket that handles the client request.
            Socket listener = (Socket)ar.AsyncState;
            Socket handler = listener.EndAccept(ar);

            // Create the state object.
            StateObject state = new StateObject();
            state.workSocket = handler;
            handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                new AsyncCallback(ReadCallback), state);
        }

        public static void ReadCallback(IAsyncResult ar)
        {
            String content = String.Empty;


            StateObject state = (StateObject)ar.AsyncState;
            Socket handler = state.workSocket;

            int bytesRead = handler.EndReceive(ar);

            if (bytesRead > 0)
            {

                state.sb.Append(Encoding.ASCII.GetString(
                    state.buffer, 0, bytesRead));

                content = state.sb.ToString();
                if (content.IndexOf("<EOF>") > -1)
                {
                    // All the data has been read from the 
                    // client. Display it on the console.
                    Console.WriteLine("Read {0} bytes from socket. \n Data : {1}",
                        content.Length, content);
                    // Echo the data back to the client.
                    Send(handler, content);
                }
                else
                {
                    // Not all data received. Get more.
                    handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                    new AsyncCallback(ReadCallback), state);
                }
            }
        }

        private static void Send(Socket handler, String data)
        {
            // Convert the string data to byte data using ASCII encoding.
            byte[] byteData = Encoding.ASCII.GetBytes(data);


            handler.BeginSend(byteData, 0, byteData.Length, 0,
                new AsyncCallback(SendCallback), handler);
        }

        private static void SendCallback(IAsyncResult ar)
        {
            try
            {

                Socket handler = (Socket)ar.AsyncState;


                int bytesSent = handler.EndSend(ar);
                Console.WriteLine("Sent {0} bytes to client.", bytesSent);

                handler.Shutdown(SocketShutdown.Both);
                handler.Close();

            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }


        public static int Main(String[] args)
        {
            StartListening();
            return 0;
        }
    }
}
Krasi вне форума Ответить с цитированием
Старый 03.11.2015, 17:04   #16
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

А во, я начал делать, и не понял. Есть у меня while(true), ок. А что дальше? У меня сейчас два основных класса: public partial class Form1 : Form и public class AsynchronousSocketListener.

Мне потоки ставить в классе public class AsynchronousSocketListener?
Что надо на потоки-то разбивать?
Krasi вне форума Ответить с цитированием
Старый 03.11.2015, 17:24   #17
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Или можно пример потоков попроще? Чтобы сначала отдельное приложение сделать, в котором будет, например, 2 потока. Как? И что это будет значить, что параллельно обрабатывается 2 потока?
Krasi вне форума Ответить с цитированием
Старый 03.11.2015, 17:24   #18
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Очисть свой разум юный падаван.
Выкинь весь код нафик и начни с простого:
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Net;
using System.Net.Sockets;

namespace WindowsFormsApplication1
{
    public class Listener {
        public void Listen() {
            // create the socket
            Socket listenSocket = new Socket(AddressFamily.InterNetwork,
                                             SocketType.Stream,
                                             ProtocolType.Tcp);

            // bind the listening socket to the port
            IPAddress hostIP = (Dns.Resolve(IPAddress.Any.ToString())).AddressList[0];
            IPEndPoint ep = new IPEndPoint(hostIP, 8080);
            listenSocket.Bind(ep);

            // start listening
            listenSocket.Listen(100);
            while (true)
            {

                Socket mySocket = listenSocket.Accept();
                //.......
            }
        }
    }
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //При загрузке формы создаем поток класа-прослушивателя
            Listener l = new Listener();
            Thread ListenThread = new Thread(new ThreadStart(l.Listen));
            ListenThread.Start();
        }
    }
}
Не могу похвастаться что эта наработка супер-пупер, но смысл ее в том, чтоб показать как примерно хотя-бы установить доппоток для прослушки.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запуск программы в консоли deniscatch Общие вопросы по Java, Java SE, Kotlin 2 04.08.2014 23:38
Перенос с консоли на форму вызвал ряд ошибок / С++ diha-o C/C++ Сетевое программирование 0 29.04.2014 23:18
перенос курсора в консоли в заданную позицию Felian Qt и кроссплатформенное программирование С/С++ 1 18.12.2011 09:32
Перенос программы в HTML romanzi HTML и CSS 6 08.11.2010 22:01
Переписать 3 программы с Delphi консоли na C++ to-ot Фриланс 6 22.10.2010 02:38