C # Асинхронное сообщение сокета может ждать еще 5 секунд до следующего сообщения сокета? - PullRequest
0 голосов
/ 29 марта 2011

В моем проекте я использую Asynchronous Socket Server, как показано ниже.

for (int i = 0; i < localip.Length; i++)
                {
                    try
                    {


                        m_mainSocket[1] = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                        m_mainSocket[1].Bind(new IPEndPoint(localip[i], port));
                        m_mainSocket[1].Listen(1000);
                        m_mainSocket[1].BeginAccept(new AsyncCallback(OnClientConnect2), m_mainSocket[1]);
                        Log.updateErrorlog(localip[i].ToString()+" Port : "+port);
                    }
                    catch
                    { }
                }

public void OnClientConnect2(IAsyncResult ar)
        {

            Socket listener2 = (Socket)ar.AsyncState;
            try
            {

                NewConnection2(listener2.EndAccept(ar));
                listener2.BeginAccept(new AsyncCallback(OnClientConnect2), listener2);
            }
            catch
            {

                listener2.Close();

            }
        }
        public void NewConnection2(Socket sockClient)
        {
            SocketChatClient client2 = new SocketChatClient(sockClient);
            //m_aryClients.Add(client2);
            client2.SetupRecieveCallback2(this);
            if (!InvokeRequired)
            {

            }
            else
            {

            }
        }

        public void WaitForData(System.Net.Sockets.Socket soc)
        {

            SocketChatClient client2 = new SocketChatClient(soc);
            client2.SetupRecieveCallback2(this);

        }

        public void OnDataReceived(IAsyncResult ar)
        {

            SocketChatClient client = (SocketChatClient)ar.AsyncState;
            byte[] aryRet = client.GetRecievedData(ar);
            string mdz3 = "";
            mdz3 = System.Text.Encoding.ASCII.GetString(aryRet, 0, aryRet.Length);

            if (aryRet.Length < 1)
            {
                client.Sock.Close();

                return;
            }

            messageReceived msend = new messageReceived(mdz3, aryRet, client.Sock);
            msend.msg_thread.Start();

            msend.msg_thread.Join();

            client.SetupRecieveCallback2(this);


        }

И ниже мое сообщение Получено .cs класс.

public Thread s_thread;
        private string RecvData;
        private Random RNo = new Random();
        private Socket ClientSocket;

        public MsgThread(byte[] aryRecvData,Socket _ClientSocket)
        {
            RecvData = System.Text.Encoding.ASCII.GetString(aryRecvData,0,aryRecvData.Length);
            ClientSocket = _ClientSocket;
            s_thread = new Thread(new ThreadStart(ProcessThread));
        }

private void MsgThreadProcess()
        {
            lock (this)
            {
string[] msg = RecvData.Split('|');
Process(msg);
            }
        }

Когда я получаю первое сообщение сокета, я хочу подождать еще 5 секунд для второго сообщения сокета и обработать два сообщения. Если я не получу ничего в течение 5 секунд, я продолжу обработку первого. Пожалуйста, порекомендуйте. Спасибо.

1 Ответ

1 голос
/ 29 марта 2011

Почему бы не запустить поток обработки сообщений? Вы отправляете на него сообщения и позволяете ему обрабатывать дополнительную логику обработки, например, ждать еще 5 секунд для второго сообщения. Что-то в этом роде:

public class MessageProcessor
{
    private Thread _ProcessingThread;
    private Queue<Message> _MessageQueue;
    private AutoResetEvent _MessagePosted;

    public MessageProcessor()
    {
        _MessagePosted = new AutoResetEvent(false);
        _MessageQueue = new Queue<Message>();
        _ProcessingThread = new Thread(ProcessMessages);
        _ProcessingThread.Start();
    }

    public void Post(Message msg)
    {
        _MessageQueue.Enqueue(msg);
        _MessagePosted.Set();
    }

    private void ProcessMessages(object state)
    {
        while (!_Quit)
        {
            _MessagePosted.WaitOne();
            _MessagePosted.WaitOne(TimeSpan.FromSeconds(5));
            ... process message queue
        }
    }
}

И в своем сообщении вы получаете код

messageProcessor.Post(receivedMessage);

Вам потребуется установить блокировку для защиты своей очереди и т. Д. (Хотя для .net 4 у вас есть ConcurrentQueue<T>). Вы также можете использовать BeginInvoke в потоке обработки сообщений для обработки асинхронной обработки.

...