//run in main thread void Socket::processEventQueue(float delta) { pthread_mutex_lock(&eventQueueMutex); //剪切事件队列(多线程环境下,减少线程对事件队列的持有时间) __Array* tempArray = __Array::create(); tempArray->addObjectsFromArray(this->eventQueue); this->eventQueue->removeAllObjects(); pthread_mutex_unlock(&eventQueueMutex); //处理事件 for (int i = 0; i < tempArray->count(); i++) { SocketEvent* event = (SocketEvent*)tempArray->getObjectAtIndex(i); switch (event->getType()) { case SocketEventTypeConnected: { this->connecting = false; this->connected = true; if (this->delegate) { this->delegate->onConnected(this); } } break; case SocketEventTypeReceivedMessage: { if (this->delegate) { this->delegate->onReceived(this, event->getData().getBytes(), event->getData().getSize()); } } break; case SocketEventTypeException: { if (this->delegate) { std::string errorMsg = (char*)event->getData().getBytes(); this->delegate->onException(this, errorMsg); } } break; case SocketEventTypeDisConnected: { this->connected = false; if (this->delegate) { this->delegate->onDisconnected(this); } } break; default: break; } } }
void Peer::handleEvent(Event *event) { if(event->getDispatcher() == socket) { SocketEvent *socketEvent = (SocketEvent*) event; switch(socketEvent->getEventCode()) { case SocketEvent::EVENT_DATA_RECEIVED: PeerConnection *connection = getPeerConnection(socketEvent->fromAddress); if(!connection) connection = addPeerConnection(socketEvent->fromAddress); if(checkPacketAcks(connection, (Packet*)socketEvent->data)) handlePacket((Packet*)socketEvent->data, connection); break; } } else if(event->getDispatcher() == updateTimer) { updateThread(); } }
SocketEvent* SocketEvent::create(SocketEventType type, Data data) { SocketEvent* event = new SocketEvent(type,data); event->autorelease(); return event; }
void SocketThread::run() { //cout << "SocketThread::run - Thread started " << myId << "\n"; VirtualMachine &vm = VirtualMachine::getInstance(); //cout << "SocketThread::run - starting socket \n"; // mySocket->start(); //cout << "SocketThread::run - locking mutex \n"; mySocket->eventStartListen(); //cout << "SocketThread::run - start wait \n"; while (true) { mySocket->eventWait(); //cout << "SocketThread::run - eventWait over \n"; while (mySocket->eventIsAvailable()) { SocketEvent socketEvent = mySocket->eventFetch(); switch (socketEvent.getType()) { case SocketEvent::TYPE_CONNECTED: //cout << "SocketThread::run - event CONNECTED \n"; vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'CONNECTED', '" + escape(socketEvent.getData()) + "');"); break; case SocketEvent::TYPE_CONNECTING: //cout << "SocketThread::run - event CONNECTING \n"; vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'CONNECTING', '" + escape(socketEvent.getData()) + "');"); break; case SocketEvent::TYPE_CONNECTION_CLOSED: //cout << "SocketThread::run - event CLOSED \n"; vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'CLOSED', '" + escape(socketEvent.getData()) + "');"); break; case SocketEvent::TYPE_CONNECTION_DIED: //cout << "SocketThread::run - event DIED \n"; vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'DIED', '" + escape(socketEvent.getData()) + "');"); break; case SocketEvent::TYPE_CONNECTION_RESET: //cout << "SocketThread::run - event RESET \n"; vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'RESET', '" + escape(socketEvent.getData()) + "');"); break; case SocketEvent::TYPE_CONNECTION_FAILED: //cout << "SocketThread::run - event CONNECTION_FAILED \n"; vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'CONNECTION_FAILED', '" + escape(socketEvent.getData()) + "');"); break; case SocketEvent::TYPE_DATA: //cout << "SocketThread::run - event DATA \n"; vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'DATA', '" + escape(socketEvent.getData()) + "');"); break; case SocketEvent::TYPE_INACTIVITY: //cout << "SocketThread::run - event INACTIVITY \n"; vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'INACTIVITY', '" + escape(socketEvent.getData()) + "');"); break; case SocketEvent::TYPE_WAITING_RECONNECT: //cout << "SocketThread::run - event WAITING_RECONNECT \n"; vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'WAITING_RECONNECT', '" + escape(socketEvent.getData()) + "');"); break; } } } //cout << "SocketThread::run - Thread end?\n"; mySocket->eventStopListen(); }