Просмотр исходного кода

sample updated, http request changes reverted

Arnis Lielturks 7 лет назад
Родитель
Сommit
223efd9672

+ 86 - 41
Source/Samples/54_P2PMultiplayer/P2PMultiplayer.cpp

@@ -158,7 +158,6 @@ void P2PMultiplayer::SubscribeToEvents()
 
     SubscribeToEvent(E_CLIENTCONNECTED, URHO3D_HANDLER(P2PMultiplayer, HandleClientConnected));
     SubscribeToEvent(E_CLIENTDISCONNECTED, URHO3D_HANDLER(P2PMultiplayer, HandleClientDisconnected));
-    SubscribeToEvent(E_HTTPREQUESTFINISHED, URHO3D_HANDLER(P2PMultiplayer, HandleHttpResponse));
     SubscribeToEvent(E_P2PALLREADYCHANGED, URHO3D_HANDLER(P2PMultiplayer, HandleAllReadyChanged));
 
 //    SubscribeToEvent(refreshServerList_, "Released", URHO3D_HANDLER(LANDiscovery, HandleDoNetworkDiscovery));
@@ -173,7 +172,9 @@ void P2PMultiplayer::HandleStartP2PSession(StringHash eventType, VariantMap& eve
 {
     URHO3D_LOGINFO("HandleStartP2PSession");
     GetSubsystem<Network>()->P2PStartSession(scene_);
-    GetSubsystem<Network>()->MakeHttpRequest("http://frameskippers.com:82/?guid=" + GetSubsystem<Network>()->P2PGetGUID());
+    httpRequest_ = GetSubsystem<Network>()->MakeHttpRequest("http://frameskippers.com:82/?guid=" + GetSubsystem<Network>()->P2PGetGUID());
+
+    SubscribeToEvent(E_P2PSESSIONSTARTED, URHO3D_HANDLER(P2PMultiplayer, HandleSessionStarted));
 }
 
 void P2PMultiplayer::HandleJoinP2PSession(StringHash eventType, VariantMap& eventData)
@@ -182,6 +183,12 @@ void P2PMultiplayer::HandleJoinP2PSession(StringHash eventType, VariantMap& even
     GetSubsystem<Network>()->P2PJoinSession(guid_->GetText(), scene_);
 }
 
+void P2PMultiplayer::HandleSessionStarted(StringHash eventType, VariantMap& eventData)
+{
+    UnsubscribeFromEvent(E_P2PSESSIONSTARTED);
+    CreatePlayerNode(GetSubsystem<Network>()->GetServerConnection());
+}
+
 void P2PMultiplayer::HandleReady(StringHash eventType, VariantMap& eventData)
 {
     URHO3D_LOGINFO("Ready");
@@ -216,7 +223,14 @@ void P2PMultiplayer::HandleUpdate(StringHash eventType, VariantMap& eventData)
     }
 
     if (timer_.GetMSec(false) > 1000) {
-        GetSubsystem<Network>()->DisplayPingTimes();
+        PODVector<Node*> nodes;
+        scene_->GetNodesWithTag(nodes, "Player");
+        URHO3D_LOGINFO("-------- NODES " + String(nodes.Size()));
+        for (auto it = nodes.Begin(); it != nodes.End(); ++it) {
+            URHO3D_LOGINFO("Node " + String((*it)->GetID()) + " => " + (*it)->GetVar("GUID").GetString());
+        }
+        URHO3D_LOGINFO("----------------");
+//        GetSubsystem<Network>()->DisplayPingTimes();
         i++;
         timer_.Reset();
 //        URHO3D_LOGINFO(" ");
@@ -245,8 +259,32 @@ void P2PMultiplayer::HandleUpdate(StringHash eventType, VariantMap& eventData)
 //        GetSubsystem<Network>()->P2PShowReadyStatus();
 //        URHO3D_LOGINFO("");
 
-        // Just query for the newer P2P session
-        GetSubsystem<Network>()->MakeHttpRequest("http://frameskippers.com:82/guid.txt");
+        if (httpRequest_.Null()) {
+            httpRequest_ = GetSubsystem<Network>()->MakeHttpRequest("http://frameskippers.com:82/guid.txt");
+            message_.Clear();
+        }
+        else
+        {
+            // Initializing HTTP request
+            if (httpRequest_->GetState() == HTTP_INITIALIZING)
+                return;
+                // An error has occurred
+            else if (httpRequest_->GetState() == HTTP_ERROR)
+            {
+            }
+                // Get message data
+            else
+            {
+                if (httpRequest_->GetAvailableSize() > 0) {
+                    message_ += httpRequest_->ReadLine();
+                }
+                else
+                {
+                    guid_->SetText(message_);
+                    httpRequest_.Reset();
+                }
+            }
+        }
 
         if (GetSubsystem<Network>()->P2PGetReady()) {
             static_cast<Text*>(readyButton_->GetChild(0))->SetText("Set unready");
@@ -265,6 +303,8 @@ void P2PMultiplayer::Init()
     GetSubsystem<Network>()->SetNATServerInfo("frameskippers.com", 61111);
 //    GetSubsystem<Network>()->BanAddress("192.168.68.*");
     GetSubsystem<Network>()->SetUpdateFps(30);
+
+    httpRequest_ = GetSubsystem<Network>()->MakeHttpRequest("http://frameskippers.com:82/guid.txt");
 }
 
 //
@@ -462,6 +502,42 @@ void P2PMultiplayer::HandleClientConnected(StringHash eventType, VariantMap& eve
     auto* newConnection = static_cast<Connection*>(eventData[P_CONNECTION].GetPtr());
     newConnection->SetScene(scene_);
 
+    CreatePlayerNode(newConnection);
+}
+
+void P2PMultiplayer::HandleClientDisconnected(StringHash eventType, VariantMap& eventData)
+{
+    using namespace ClientConnected;
+//
+//    // When a client disconnects, remove the controlled object
+    auto* connection = static_cast<Connection*>(eventData[P_CONNECTION].GetPtr());
+    DestroyPlayerNode(connection);
+}
+
+void P2PMultiplayer::HandleResetHost(StringHash eventType, VariantMap& eventData)
+{
+    GetSubsystem<Network>()->P2PResetHost();
+}
+
+void P2PMultiplayer::HandleAllReadyChanged(StringHash eventType, VariantMap& eventData)
+{
+    using namespace P2PAllReadyChanged;
+    _allReady = eventData[P_READY].GetBool();
+}
+
+void P2PMultiplayer::HandleDisconnect(StringHash eventType, VariantMap& eventData)
+{
+    GetSubsystem<Network>()->Disconnect(1000);
+    for (auto it = playerNodes_.Begin(); it != playerNodes_.End(); ++it) {
+        if ((*it).second_) {
+            (*it).second_->Remove();
+        }
+    }
+    playerNodes_.Clear();
+}
+
+void P2PMultiplayer::CreatePlayerNode(Connection* connection)
+{
     // Then create a controllable object for that client
 //    Node* newObject = CreateControllableObject();
 //    serverObjects_[newConnection] = newObject;
@@ -473,7 +549,9 @@ void P2PMultiplayer::HandleClientConnected(StringHash eventType, VariantMap& eve
     auto* cache = GetSubsystem<ResourceCache>();
 
     // Create the scene node & visual representation. This will be a replicated object
-    Node* ballNode = scene_->CreateChild(newConnection->GetAddress());
+    Node* ballNode = scene_->CreateChild();
+    ballNode->AddTag("Player");
+    ballNode->SetVar("GUID", connection->GetGUID());
     ballNode->SetPosition(Vector3(0, 10, 0));
     ballNode->SetScale(0.5f);
     auto* ballObject = ballNode->CreateComponent<StaticModel>();
@@ -495,46 +573,13 @@ void P2PMultiplayer::HandleClientConnected(StringHash eventType, VariantMap& eve
     auto* light = ballNode->CreateComponent<Light>();
     light->SetRange(3.0f);
     light->SetColor(Color(0.5f + ((unsigned)Rand() & 1u) * 0.5f, 0.5f + ((unsigned)Rand() & 1u) * 0.5f, 0.5f + ((unsigned)Rand() & 1u) * 0.5f));
-    playerNodes_[newConnection] = ballNode;
+    playerNodes_[connection] = ballNode;
 }
 
-void P2PMultiplayer::HandleClientDisconnected(StringHash eventType, VariantMap& eventData)
+void P2PMultiplayer::DestroyPlayerNode(Connection* connection)
 {
-    using namespace ClientConnected;
-//
-//    // When a client disconnects, remove the controlled object
-    auto* connection = static_cast<Connection*>(eventData[P_CONNECTION].GetPtr());
     if (playerNodes_[connection]) {
         playerNodes_[connection]->Remove();
         playerNodes_.Erase(connection);
     }
-}
-
-void P2PMultiplayer::HandleResetHost(StringHash eventType, VariantMap& eventData)
-{
-    GetSubsystem<Network>()->P2PResetHost();
-}
-
-void P2PMultiplayer::HandleHttpResponse(StringHash eventType, VariantMap& eventData)
-{
-    using namespace HttpRequestFinished;
-    //URHO3D_LOGINFO("Response got: " + eventData[P_ADDRESS].GetString() + " => " + eventData[P_RESPONSE].GetString());
-    guid_->SetText(eventData[P_RESPONSE].GetString());
-}
-
-void P2PMultiplayer::HandleAllReadyChanged(StringHash eventType, VariantMap& eventData)
-{
-    using namespace P2PAllReadyChanged;
-    _allReady = eventData[P_READY].GetBool();
-}
-
-void P2PMultiplayer::HandleDisconnect(StringHash eventType, VariantMap& eventData)
-{
-    GetSubsystem<Network>()->Disconnect(1000);
-    for (auto it = playerNodes_.Begin(); it != playerNodes_.End(); ++it) {
-        if ((*it).second_) {
-            (*it).second_->Remove();
-        }
-    }
-    playerNodes_.Clear();
 }

+ 7 - 3
Source/Samples/54_P2PMultiplayer/P2PMultiplayer.h

@@ -100,13 +100,15 @@ private:
     void HandleReady(StringHash eventType, VariantMap& eventData);
 
     void HandleResetHost(StringHash eventType, VariantMap& eventData);
-
-    void HandleHttpResponse(StringHash eventType, VariantMap& eventData);
-
     void HandleAllReadyChanged(StringHash eventType, VariantMap& eventData);
 
+    void HandleSessionStarted(StringHash eventType, VariantMap& eventData);
+
     void HandleDisconnect(StringHash eventType, VariantMap& eventData);
 
+    void CreatePlayerNode(Connection* connection);
+    void DestroyPlayerNode(Connection* connection);
+
     Timer timer_;
 //    /// Stop server
 //	void HandleStopServer(StringHash eventType, VariantMap& eventData);
@@ -129,6 +131,8 @@ private:
     SharedPtr<Text> hostGuid_;
     SharedPtr<RigidBody> body_;
     HashMap<Connection*, WeakPtr<Node>> playerNodes_;
+    String message_;
+    SharedPtr<HttpRequest> httpRequest_;
 
     SharedPtr<Node> ball_;
     bool _allReady;

+ 1 - 1
Source/ThirdParty/SLikeNet/CMakeLists.txt

@@ -23,6 +23,7 @@ add_definitions (-D_RAKNET_SUPPORT_DirectoryDeltaTransfer=0 -D_RAKNET_SUPPORT_Fi
 add_definitions (-D_RAKNET_SUPPORT_ConsoleServer=0 -D_RAKNET_SUPPORT_RakNetTransport=0 -D_RAKNET_SUPPORT_TCPInterface=0 -D_RAKNET_SUPPORT_LogCommandParser=0 -D_RAKNET_SUPPORT_RakNetCommandParser=0)
 add_definitions (-D_RAKNET_SUPPORT_Rackspace=0 -D_RAKNET_SUPPORT_PacketizedTCP=0 -D_RAKNET_SUPPORT_RPC4Plugin=0 -D_RAKNET_SUPPORT_Router2=0)
 add_definitions (-D_RAKNET_SUPPORT_MessageFilter=0 -D_RAKNET_SUPPORT_FileListTransfer=0)
+add_definitions (-D_RAKNET_SUPPORT_HTTPConnection2=0 -D_RAKNET_SUPPORT_HTTPConnection=0)
 
 # Enable the ones we actually need
 # P2P Multiplayer
@@ -30,7 +31,6 @@ add_definitions (-D_RAKNET_SUPPORT_FullyConnectedMesh2=1)
 add_definitions (-D_RAKNET_SUPPORT_PacketLogger=1)
 add_definitions (-D_RAKNET_SUPPORT_ReplicaManager3=1)
 add_definitions (-D_RAKNET_SUPPORT_ReadyEvent=1)
-add_definitions (-D_RAKNET_SUPPORT_HTTPConnection2=1 -D_RAKNET_SUPPORT_HTTPConnection=1)
 
 if (URHO3D_LIB_TYPE STREQUAL SHARED)
     add_definitions(-D_RAKNET_DLL=1)

+ 5 - 0
Source/Urho3D/Network/Connection.cpp

@@ -1619,4 +1619,9 @@ void Connection::SetAddressOrGUID(const SLNet::AddressOrGUID& addr)
     address_ = new SLNet::AddressOrGUID(addr);
 }
 
+String Connection::GetGUID()
+{
+    return address_->rakNetGuid.ToString();
+}
+
 }

+ 2 - 2
Source/Urho3D/Network/Connection.h

@@ -40,8 +40,6 @@ namespace SLNet
     class FullyConnectedMesh2;
     class ReadyEvent;
     class ConnectionGraph2;
-    class HTTPConnection2;
-    class TCPInterface;
 }
 
 namespace Urho3D
@@ -161,6 +159,8 @@ public:
     void Ban();
     /// Return the RakNet address/guid.
     const SLNet::AddressOrGUID& GetAddressOrGUID() const { return *address_; }
+
+    String GetGUID();
     /// Set the the RakNet address/guid.
     void SetAddressOrGUID(const SLNet::AddressOrGUID& addr);
 

+ 11 - 56
Source/Urho3D/Network/Network.cpp

@@ -47,8 +47,6 @@
 #include <SLikeNet/BitStream.h>
 #include <SLikeNet/ReadyEvent.h>
 #include <SLikeNet/ConnectionGraph2.h>
-#include "SLikeNet/HTTPConnection2.h"
-#include "SLikeNet/TCPInterface.h"
 
 #ifdef SendMessage
 #undef SendMessage
@@ -223,11 +221,6 @@ Network::Network(Context* context) :
     rakPeer_->AttachPlugin(readyEvent_);
     connectionGraph2_ = SLNet::ConnectionGraph2::GetInstance();
     rakPeer_->AttachPlugin(connectionGraph2_);
-    httpConnection2_ = SLNet::HTTPConnection2::GetInstance();
-    tcp_ = SLNet::TCPInterface::GetInstance();
-    tcp_->AttachPlugin(httpConnection2_);
-
-    tcp_->Start(0, 0, 1);
 
     rakPeer_->SetTimeoutTime(SERVER_TIMEOUT_TIME, SLNet::UNASSIGNED_SYSTEM_ADDRESS);
     rakPeerClient_->SetTimeoutTime(SERVER_TIMEOUT_TIME, SLNet::UNASSIGNED_SYSTEM_ADDRESS);
@@ -305,7 +298,7 @@ Network::~Network()
     Disconnect(1000);
 
     fullyConnectedMesh2_->ResetHostCalculation();
-    
+
     rakPeer_->DetachPlugin(natPunchthroughServerClient_);
     rakPeerClient_->DetachPlugin(natPunchthroughClient_);
     rakPeer_->DetachPlugin(fullyConnectedMesh2_);
@@ -331,7 +324,6 @@ Network::~Network()
     SLNet::FullyConnectedMesh2::DestroyInstance(fullyConnectedMesh2_);
     SLNet::ReadyEvent::DestroyInstance(readyEvent_);
     SLNet::ConnectionGraph2::DestroyInstance(connectionGraph2_);
-    SLNet::HTTPConnection2::DestroyInstance(httpConnection2_);
 
     rakPeer_ = nullptr;
     rakPeerClient_ = nullptr;
@@ -494,6 +486,10 @@ bool Network::P2PConnectNAT(const String& address, unsigned short port)
 
     //isServer_ = false;
     SLNet::ConnectionAttemptResult connectResult = rakPeer_->Connect(address.CString(), port, password_.CString(), password_.Length());
+    if (connectResult == SLNet::ALREADY_CONNECTED_TO_ENDPOINT) {
+        URHO3D_LOGWARNING("Already connected to server " + address + ":" + String(port) + ", error code: " + String((int)connectResult));
+        return false;
+    }
     if (connectResult != SLNet::CONNECTION_ATTEMPT_STARTED)
     {
         URHO3D_LOGERROR("Failed to connect to server " + address + ":" + String(port) + ", error code: " + String((int)connectResult));
@@ -502,7 +498,6 @@ bool Network::P2PConnectNAT(const String& address, unsigned short port)
     }
     else
     {
-
         URHO3D_LOGINFO("Connecting to server " + address + ":" + String(port));
         return true;
     }
@@ -756,11 +751,8 @@ SharedPtr<HttpRequest> Network::MakeHttpRequest(const String& url, const String&
     URHO3D_PROFILE(MakeHttpRequest);
 
     // The initialization of the request will take time, can not know at this point if it has an error or not
-    //SharedPtr<HttpRequest> request(new HttpRequest(url, verb, headers, postData));
-    //return request;
-    SLNet::RakString rsRequest = SLNet::RakString::FormatForGET(url.CString());
-    httpConnection2_->TransmitRequest(rsRequest, "frameskippers.com", 82, true);
-    return nullptr;
+    SharedPtr<HttpRequest> request(new HttpRequest(url, verb, headers, postData));
+    return request;
 }
 
 void Network::BanAddress(const String& address)
@@ -1223,8 +1215,6 @@ void Network::Update(float timeStep)
             rakPeerClient_->DeallocatePacket(packet);
         }
     }
-
-    HandleTcpResponse();
 }
 
 void Network::PostUpdate(float timeStep)
@@ -1275,7 +1265,7 @@ void Network::PostUpdate(float timeStep)
 
         if (serverConnection_)
         {
-            if (networkMode_ == PEER_TO_PEER && !isServer_) {
+            if (networkMode_ == PEER_TO_PEER && !isServer_ && serverConnection_->GetGUID() != P2PGetGUID()) {
                 // Send the client update
                 serverConnection_->SendClientUpdate();
                 serverConnection_->SendRemoteEvents();
@@ -1377,7 +1367,7 @@ void Network::HandleNATStartP2PSession(StringHash eventType, VariantMap& eventDa
     URHO3D_LOGINFO("HandleNATStartP2PSession");
     isServer_ = false;
     if (!serverConnection_) {
-        serverConnection_ = new Connection(context_, false, rakPeer_->GetMyBoundAddress(), rakPeer_);
+        serverConnection_ = new Connection(context_, false, rakPeer_->GetMyGUID(), rakPeer_);
         serverConnection_->SetScene(scene_);
         serverConnection_->SetSceneLoaded(true);
         serverConnection_->SetIdentity(identity_);
@@ -1390,6 +1380,8 @@ void Network::HandleNATStartP2PSession(StringHash eventType, VariantMap& eventDa
 
     hostGuid_ = P2PGetGUID();
     P2PSetReady(false);
+
+    SendEvent(E_P2PSESSIONSTARTED);
 }
 
 void Network::P2PJoinSession(String guid, Scene* scene, const VariantMap& identity)
@@ -1547,43 +1539,6 @@ void Network::P2PResetHost()
     fullyConnectedMesh2_->ResetHostCalculation();
 }
 
-void Network::HandleTcpResponse()
-{
-    // The following code is TCP operations for talking to the master server, and parsing the reply
-    SLNet::SystemAddress sa;
-    // This is kind of crappy, but for TCP plugins, always do HasCompletedConnectionAttempt, then Receive(), then HasFailedConnectionAttempt(),HasLostConnection()
-    sa = tcp_->HasCompletedConnectionAttempt();
-    SLNet::Packet* packet;
-    for (packet = tcp_->Receive(); packet; tcp_->DeallocatePacket(packet), packet = tcp_->Receive())
-        ;
-    sa = tcp_->HasFailedConnectionAttempt();
-    sa = tcp_->HasLostConnection();
-
-    SLNet::RakString stringTransmitted;
-    SLNet::RakString hostTransmitted;
-    SLNet::RakString responseReceived;
-    SLNet::SystemAddress hostReceived;
-    ptrdiff_t contentOffset;
-    if (httpConnection2_->GetResponse(stringTransmitted, hostTransmitted, responseReceived, hostReceived, contentOffset))
-    {
-        if (responseReceived.IsEmpty() == false)
-        {
-            if (contentOffset == -1)
-            {
-                // No content
-                printf(responseReceived.C_String());
-            }
-            else
-            {
-                VariantMap data = GetEventDataMap();
-                data[HttpRequestFinished::P_ADDRESS] = "123";
-                data[HttpRequestFinished::P_RESPONSE] = String(responseReceived.C_String() + contentOffset);
-                SendEvent(E_HTTPREQUESTFINISHED, data);
-            }
-        }
-    }
-}
-
 void Network::SetMode(NetworkMode mode, bool force)
 {
     if (rakPeer_->IsActive() || rakPeerClient_->IsActive()) {

+ 0 - 6
Source/Urho3D/Network/Network.h

@@ -187,8 +187,6 @@ private:
     void ConfigureNetworkSimulator();
     /// All incoming packages are handled here.
     void HandleIncomingPacket(SLNet::Packet* packet, bool isServer);
-    /// Handle Http request responses
-    void HandleTcpResponse();
     /// SLikeNet peer instance for server connection.
     SLNet::RakPeerInterface* rakPeer_;
     /// SLikeNet peer instance for client connection.
@@ -239,10 +237,6 @@ private:
     SLNet::FullyConnectedMesh2 *fullyConnectedMesh2_;
     /// Connection graph to automate peer to peer discovery
     SLNet::ConnectionGraph2 *connectionGraph2_;
-    /// Http request interface
-    SLNet::HTTPConnection2 *httpConnection2_;
-    /// Support module for Http requests
-    SLNet::TCPInterface *tcp_;
     /// P2P current host guid
     String hostGuid_;
     /// current network mode - P2P or server-client mode

+ 5 - 7
Source/Urho3D/Network/NetworkEvents.h

@@ -143,13 +143,6 @@ URHO3D_EVENT(E_NATMASTERCONNECTIONSUCCEEDED, NetworkNatMasterConnectionSucceeded
     URHO3D_PARAM(P_PORT, Port);         // int
 }
 
-/// Http request returned response
-URHO3D_EVENT(E_HTTPREQUESTFINISHED, HttpRequestFinished)
-{
-    URHO3D_PARAM(P_ADDRESS, Address);   // String
-    URHO3D_PARAM(P_RESPONSE, Response);         // int
-}
-
 /// When P2P network declines our connection
 URHO3D_EVENT(E_P2PJOINREQUESTDENIED, P2PJoinRequestDenied)
 {
@@ -161,4 +154,9 @@ URHO3D_EVENT(E_P2PALLREADYCHANGED, P2PAllReadyChanged)
 	URHO3D_PARAM(P_READY, Ready);   // String
 }
 
+/// Status of all p2p connection readiness
+URHO3D_EVENT(E_P2PSESSIONSTARTED, P2PSessionStarted)
+{
+}
+
 }