Exemplo n.º 1
0
//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;
        }
    }
}
Exemplo n.º 2
0
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();
	}
}
Exemplo n.º 3
0
SocketEvent* SocketEvent::create(SocketEventType type, Data data)
{
    SocketEvent* event = new SocketEvent(type,data);
    event->autorelease();
    return event;
}
Exemplo n.º 4
0
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();
}