コード例 #1
0
        public void SetupServerAndClientAndConnectThem(int bufferSize)
        {
            //setup server
            server_driver = new UdpNetworkDriver(new NetworkDataStreamParameter {
                size = bufferSize
            });
            NetworkEndPoint server_endpoint = NetworkEndPoint.LoopbackIpv4;

            server_endpoint.Port = 1337;
            server_driver.Bind(server_endpoint);
            server_driver.Listen();

            //setup client
            client_driver = new UdpNetworkDriver(new NetworkDataStreamParameter {
                size = bufferSize
            });
            clientToServerConnection = client_driver.Connect(server_endpoint);

            //update drivers
            client_driver.ScheduleUpdate().Complete();
            server_driver.ScheduleUpdate().Complete();

            //accept connection
            connectionToClient = server_driver.Accept();

            server_driver.ScheduleUpdate().Complete();
            ev = server_driver.PopEventForConnection(connectionToClient, out stream);
            Assert.IsTrue(ev == NetworkEvent.Type.Empty, "Not empty NetworkEvent on the server appeared");

            client_driver.ScheduleUpdate().Complete();
            ev = clientToServerConnection.PopEvent(client_driver, out stream);
            Assert.IsTrue(ev == NetworkEvent.Type.Connect, "NetworkEvent should have Type.Connect on the client");
        }
コード例 #2
0
 void Update()
 {
     m_Driver.ScheduleUpdate().Complete();
     RemoveOldConnections();
     AddNewConnections();
     QueryForNewEvents();
 }
コード例 #3
0
    void Update()
    {
        if (m_Connected)
        {
            SendLoop();
        }

        m_Driver.ScheduleUpdate().Complete();

        DataStreamReader stream;

        NetworkEvent.Type cmd;

        while ((cmd = m_Connection.PopEvent(m_Driver, out stream)) != NetworkEvent.Type.Empty)
        {
            if (cmd == NetworkEvent.Type.Connect)
            {
                Debug.Log("We are now connected to the server");
                m_Connected = true;
            }
            else if (cmd == NetworkEvent.Type.Data)
            {
                Read(stream);
            }
            else if (cmd == NetworkEvent.Type.Disconnect)
            {
                Debug.Log("Client got disconnected from server");
            }
        }
    }
コード例 #4
0
 void Update()
 {
     m_Driver.ScheduleUpdate().Complete();
     CleanConnect();
     NewConnect();
     CheckConnect();
 }
コード例 #5
0
ファイル: Client.cs プロジェクト: JulianHeitkamp/AntiYoyClone
    private void Update()
    {
        if (!started)
        {
            return;
        }
        driver.ScheduleUpdate().Complete();
        if (!connection.IsCreated)
        {
            return;
        }

        DataStreamReader sr;

        NetworkEvent.Type cmd;
        while ((cmd = connection.PopEvent(driver, out sr)) != NetworkEvent.Type.Empty)
        {
            if (cmd == NetworkEvent.Type.Connect)
            {
            }

            if (cmd == NetworkEvent.Type.Disconnect)
            {
            }
            if (cmd == NetworkEvent.Type.Data)
            {
                var    readerCtx = default(DataStreamReader.Context);
                byte[] data      = sr.ReadBytesAsArray(ref readerCtx, sr.Length);
                string cmdString = System.Text.Encoding.UTF8.GetString(data);

                ProcessCommand(cmdString);
            }
        }
    }
コード例 #6
0
    void Update()
    {
        driver.ScheduleUpdate().Complete();
        AcceptNewConnections();
        numClients.text = "Clients: " + connections.Length.ToString();
        PrintClientMessages();
        UpdateClientPositions(Time.deltaTime);

        DataStreamReader stream;

        for (int i = 0; i < connections.Length; i++)
        {
            if (!connections[i].IsCreated)
            {
                Assert.IsTrue(true);
            }

            clientTimers[i] += Time.deltaTime;
            if (clientTimers[i] > dropTime)
            {
                DropConnection(i);
            }
            else
            {
                NetworkEvent.Type cmd;
                while ((cmd = driver.PopEventForConnection(connections[i], out stream)) != NetworkEvent.Type.Empty)
                {
                    clientMessages[i] = ReadMessage(stream);
                    clientTimers[i]   = 0;
                    SendMessage(GenerateFinalString(), driver, connections[i]);
                }
            }
        }
    }
コード例 #7
0
ファイル: SocketTests.cs プロジェクト: zs782306174/DOTSSample
        void ConnectTogether(UdpNetworkDriver server, UdpNetworkDriver client, int maxIterations, out NetworkConnection serverConnection, out NetworkConnection clientConnection)
        {
            int servers = 0, clients = 0, iterations = 0;

            serverConnection = default(NetworkConnection);
            clientConnection = default(NetworkConnection);

            DataStreamReader reader;

            NetworkConnection poppedConnection = default(NetworkConnection);

            while (clients != 1 || servers != 1)
            {
                Assert.Less(iterations++, maxIterations);

                server.ScheduleUpdate().Complete();

                var newConnection = server.Accept();
                if (newConnection != default(NetworkConnection))
                {
                    clients++;
                    clientConnection = newConnection;
                }

                if (client.PopEvent(out poppedConnection, out reader) == ExperimentalEventType.Connect)
                {
                    serverConnection = poppedConnection;
                    servers++;
                }

                client.ScheduleUpdate().Complete();
                Assert.AreNotEqual(clientConnection, default(NetworkConnection));
            }
        }
コード例 #8
0
ファイル: SocketTests.cs プロジェクト: zs782306174/DOTSSample
        void SendReceive(UdpNetworkDriver sender, UdpNetworkDriver receiver, NetworkConnection from, NetworkConnection to, byte[] data, int maxIterations)
        {
            using (var writer = new DataStreamWriter(data.Length, Allocator.Persistent))
            {
                writer.Write(data, data.Length);

                // sender.Send(to, writer); // old one preserved to explain how names were chosen :-)
                to.Send(sender, writer); // new :-)

                sender.ScheduleUpdate().Complete();
                receiver.ScheduleUpdate().Complete();

                var buffer = new byte[1472];
                int size   = 0;
                NetworkConnection connection;
                PollEvent(ExperimentalEventType.Data, maxIterations, receiver, ref buffer, out size, out connection);

                Assert.AreEqual(from, connection);
                Assert.AreEqual(data.Length, size);

                for (int i = 0; i < data.Length; i++)
                {
                    Assert.AreEqual(data[i], buffer[i]);
                }
            }
        }
コード例 #9
0
ファイル: SocketTests.cs プロジェクト: zs782306174/DOTSSample
        ExperimentalEventType PollEvent(ExperimentalEventType ev, int maxIterations, UdpNetworkDriver socket, ref byte[] buffer, out int size, out NetworkConnection connection)
        {
            int iterator = 0;

            size       = 0;
            connection = default(NetworkConnection);

            while (iterator++ < maxIterations)
            {
                DataStreamReader reader;
                var context = default(DataStreamReader.Context);
                ExperimentalEventType e;
                if ((e = socket.PopEvent(out connection, out reader)) == ev)
                {
                    if (reader.IsCreated)
                    {
                        reader.ReadBytesIntoArray(ref context, ref buffer, reader.Length);
                        size = reader.Length;
                    }
                    return(e);
                }
                socket.ScheduleUpdate().Complete();
            }
            return(ExperimentalEventType.Empty);
        }
コード例 #10
0
ファイル: SoakServer.cs プロジェクト: yagodar/multiplayer
    public void Update()
    {
        m_Tick++;
        m_UpdateHandle.Complete();

        if (m_PendingDisconnects.IsCreated)
        {
            m_PendingDisconnects.Dispose();
        }

        var acceptJob = new SoakServerAcceptJob
        {
            now         = m_Tick,
            driver      = m_ServerDriver,
            connections = m_Connections
        };
        var soakJob = new SoakServerUpdateClientsJob
        {
            driver      = m_ServerDriver.ToConcurrent(),
            pipeline    = m_Pipeline,
            connections = m_Connections.AsDeferredJobArray()
        };

        /*var time = Time.fixedTime;
         * if (time > m_NextStatsPrint)
         * {
         *  PrintStatistics();
         *  m_NextStatsPrint = time + 10;
         * }*/

        m_UpdateHandle = m_ServerDriver.ScheduleUpdate();
        m_UpdateHandle = acceptJob.Schedule(m_UpdateHandle);
        m_UpdateHandle = soakJob.Schedule(m_Connections, 1, m_UpdateHandle);
    }
コード例 #11
0
ファイル: Server.cs プロジェクト: aaronvark/KGDEV4-Examples
    // Update is called once per frame
    void Update()
    {
        m_Driver.ScheduleUpdate().Complete();

        // Clean up connections
        for (int i = 0; i < m_Connections.Length; i++)
        {
            if (!m_Connections[i].IsCreated)
            {
                m_Connections.RemoveAtSwapBack(i);
                --i;
            }
        }

        // Accept new connections
        NetworkConnection c;

        while ((c = m_Driver.Accept()) != default(NetworkConnection))
        {
            m_Connections.Add(c);
            Debug.Log("Accepted a connection");
        }

        DataStreamReader stream;

        for (int i = 0; i < m_Connections.Length; i++)
        {
            if (!m_Connections[i].IsCreated)
            {
                continue;
            }

            NetworkEvent.Type cmd;
            while ((cmd = m_Driver.PopEventForConnection(m_Connections[i], out stream)) !=
                   NetworkEvent.Type.Empty)
            {
                if (cmd == NetworkEvent.Type.Data)
                {
                    //read received packet
                    DataStreamReader.Context readerCtx = default(DataStreamReader.Context);
                    PacketFunctions.ReadPacket(stream, ref readerCtx);

                    StartCoroutine(SendHelloClient(m_Connections[i]));

                    /*
                     * var readerCtx = default(DataStreamReader.Context);
                     * uint number = stream.ReadUInt(ref readerCtx);
                     * using (var writer = new DataStreamWriter(4, Allocator.Temp))
                     * {
                     *  writer.Write(number);
                     *  //other option
                     *  //m_Connections[i].Send(m_Driver, writer);
                     *  m_Driver.Send(NetworkPipeline.Null, m_Connections[i], writer);
                     * }
                     */
                }
            }
        }
    }
コード例 #12
0
    // Update is called once per frame
    private void Update()
    {
        m_Driver.ScheduleUpdate().Complete();

        // Clean up connections
        for (int i = 0; i < m_Connections.Length; i++)
        {
            if (!m_Connections[i].IsCreated)
            {
                m_Connections.RemoveAtSwapBack(i);
                --i;
            }
        }

        // Accept new connections
        NetworkConnection connection;

        while ((connection = m_Driver.Accept()) != default(NetworkConnection))
        {
            m_Connections.Add(connection);
            Debug.Log("Accepted a connection");
        }

        DataStreamReader stream;

        for (int i = 0; i < m_Connections.Length; i++)
        {
            if (!m_Connections[i].IsCreated)
            {
                continue;
            }

            NetworkEvent.Type cmd;

            while ((cmd = m_Driver.PopEventForConnection(m_Connections[i], out stream)) != NetworkEvent.Type.Empty)
            {
                if (cmd == NetworkEvent.Type.Data)
                {
                    var  readerCtx = default(DataStreamReader.Context);
                    uint number    = stream.ReadUInt(ref readerCtx);

                    Debug.Log("Got " + number + " from the client adding + 2 to it and sending it back.");

                    number += 2;

                    using (var writer = new DataStreamWriter(4, Allocator.Temp))
                    {
                        writer.Write(number);
                        m_Driver.Send(m_Pipeline, m_Connections[i], writer);
                    }
                }
                else if (cmd == NetworkEvent.Type.Disconnect)
                {
                    Debug.Log("Client disconnected from the server.");
                    m_Connections[i] = default;
                }
            }
        }
    }
コード例 #13
0
    void Update()
    {
        m_Driver.ScheduleUpdate().Complete();

        if (!m_Connection.IsCreated)
        {
            if (!Done)
            {
                Debug.Log("Something went wrong during connect");
            }
            return;
        }

        DataStreamReader stream;

        NetworkEvent.Type cmd;
        while ((cmd = m_Connection.PopEvent(m_Driver, out stream)) !=
               NetworkEvent.Type.Empty)
        {
            if (cmd == NetworkEvent.Type.Connect)
            {
                Debug.Log("We are now connected to the server");

                using (var writer = PacketFunctions.WritePacket(GameEvent.HELLO_SERVER)) {
                    //m_Connection.Send(m_Driver, writer);
                    m_Connection.Send(m_Driver, reliableUdpPipe, writer);
                }

                /*
                 * var value = 1;
                 * using (var writer = new DataStreamWriter(4, Allocator.Temp))
                 * {
                 *  writer.Write(value);
                 *  m_Connection.Send(m_Driver, writer);
                 * }
                 */
            }
            else if (cmd == NetworkEvent.Type.Data)
            {
                //read received packet
                DataStreamReader.Context readerCtx = default(DataStreamReader.Context);
                PacketFunctions.ReadPacket(stream, ref readerCtx, PushToScreen);

                /*
                 * // var readerCtx = default(DataStreamReader.Context);
                 * uint value = stream.ReadUInt(ref readerCtx);
                 * Debug.Log("Got the value = " + value + " back from the server");
                 * Done = true;
                 * m_Connection.Disconnect(m_Driver);
                 * m_Connection = default(NetworkConnection);
                 */
            }
            else if (cmd == NetworkEvent.Type.Disconnect)
            {
                Debug.Log("Client got disconnected from server");
                m_Connection = default(NetworkConnection);
            }
        }
    }
コード例 #14
0
        void WaitForNetworkUpdate()
        {
            // The DriverUpdateJob which accepts new connections should be the second job in the chain,
            //  it needs to depend on the driver update job
            var updateJob = new DriverUpdateJob
            {
                driver      = m_ServerDriver,
                connections = m_Connections
            };

            // Update the driver should be the first job in the chain
            m_UpdateHandle = m_ServerDriver.ScheduleUpdate(m_UpdateHandle);
            m_UpdateHandle = updateJob.Schedule(m_UpdateHandle);

            // Wait for the job to complete
            m_UpdateHandle.Complete();
        }
コード例 #15
0
 /// <summary>
 /// Updates network events.
 /// </summary>
 private void updateNetworkEvents()
 {
     if (networkEndPoint != null)
     {
         //Complete C# JobHandle to ensure network event updates can be processed
         networkDriver.ScheduleUpdate().Complete();
     }
 }
コード例 #16
0
 void Update()
 {
     //Debug.Log("Server is active!");
     m_Driver.ScheduleUpdate().Complete();
     CleanUpConnections();
     AcceptNewConnections();
     RoundRobinConnections();
 }
コード例 #17
0
        private void Update()
        {
            m_Driver.ScheduleUpdate().Complete();

            // CleanUpConnections
            for (int i = 0; i < m_Connections.Length; i++)
            {
                if (!m_Connections[i].IsCreated)
                {
                    Debug.Log($"Connection {i} has been cleaned up");
                    m_Connections.RemoveAtSwapBack(i);
                    --i;
                }
            }

            NetworkConnection c;

            while ((c = m_Driver.Accept()) != default(NetworkConnection))
            {
                Debug.Log($"New user connected: {c.InternalId}");

                m_Connections.Add(c);
                ClientConnected(c);
                OnClientConnected?.Invoke(c);
            }

            DataStreamReader stream;

            for (int i = 0; i < m_Connections.Length; i++)
            {
                if (!m_Connections[i].IsCreated)
                {
                    Assert.IsTrue(true);
                }

                NetworkEvent.Type cmd;

                var readerCtx = default(DataStreamReader.Context);

                while ((cmd = m_Driver.PopEventForConnection(m_Connections[i], out stream)) != NetworkEvent.Type.Empty)
                {
                    if (cmd == NetworkEvent.Type.Data)
                    {
                        Read(i, stream, ref readerCtx);
                    }
                    else if (cmd == NetworkEvent.Type.Disconnect)
                    {
                        Debug.Log("Client disconnected from server");
                        m_Connections[i] = default(NetworkConnection);
                        ClientDisconnected(m_Connections[i].InternalId);
                        OnClientDisconnected?.Invoke(m_Connections[i].InternalId);
                    }
                }
            }

            OnUpdate();
        }
コード例 #18
0
    protected override JobHandle OnUpdate(JobHandle inputDeps)
    {
        inputDeps.Complete();

        JobHandle serverJobHandle;

        //Debug.Log("server system on update");
        if (!m_Driver.IsCreated)
        {
            ReliableUtility.Parameters reliabilityParams = new ReliableUtility.Parameters {
                WindowSize = 32
            };
            SimulatorUtility.Parameters simulatorParams = new SimulatorUtility.Parameters {
                MaxPacketSize = k_PacketSize, MaxPacketCount = 30, PacketDelayMs = 100
            };

            m_Driver = new UdpNetworkDriver(simulatorParams, reliabilityParams);
            NetworkEndPoint endpoint = NetworkEndPoint.AnyIpv4;
            endpoint.Port = 9000;
            if (m_Driver.Bind(endpoint) != 0)
            {
                Debug.Log("Failed to bind to port 9000");
            }
            else
            {
                m_Driver.Listen();
                Debug.Log("driver listening on port 9000");
            }

            currentId = new NativeList <int>(1, Allocator.Persistent);
            currentId.Add(0);
        }
        else
        {
            serverJobHandle = m_Driver.ScheduleUpdate(inputDeps);
            serverJobHandle = new ListenForConnectionsJob
            {
                commandBuffer = m_Barrier.CreateCommandBuffer(),
                driver        = m_Driver,
            }.Schedule(serverJobHandle);

            serverJobHandle.Complete();

            serverJobHandle = new UpdateServerJob
            {
                commandBuffer = m_Barrier.CreateCommandBuffer().ToConcurrent(),
                driver        = m_Driver.ToConcurrent(),
                id            = currentId.AsDeferredJobArray()
            }.Schedule(this, serverJobHandle);

            m_Barrier.AddJobHandleForProducer(serverJobHandle);
            //Debug.Log("about to listen for connections");
            return(serverJobHandle);
        }

        return(inputDeps);
    }
コード例 #19
0
 void ValidateConnection()
 {
     m_Driver.ScheduleUpdate().Complete();
     if (!m_Connection.IsCreated)
     {
         clientStatus.text = "Client Status: Error";
         return;
     }
 }
コード例 #20
0
ファイル: LANServer.cs プロジェクト: Pjchardt/lan_multiplayer
        void FixedUpdate()
        {
            if (!m_ServerDriver.IsCreated)
            {
                return;
            }

            // Update the NetworkDriver. It schedules a job so we must wait for that job with Complete
            m_ServerDriver.ScheduleUpdate().Complete();

            // Accept all new connections
            while (true)
            {
                var con = m_ServerDriver.Accept();
                // "Nothing more to accept" is signaled by returning an invalid connection from accept
                if (!con.IsCreated)
                {
                    break;
                }
                m_connections.Add(con);
            }

            for (int i = 0; i < m_connections.Length; ++i)
            {
                DataStreamReader  strm;
                NetworkEvent.Type cmd;
                // Pop all events for the connection
                while ((cmd = m_ServerDriver.PopEventForConnection(m_connections[i], out strm)) != NetworkEvent.Type.Empty)
                {
                    if (cmd == NetworkEvent.Type.Data)
                    {
                        // For ping requests we reply with a pong message
                        // A DataStreamReader.Context is required to keep track of current read position since
                        // DataStreamReader is immutable
                        var readerCtx = default(DataStreamReader.Context);
                        int id        = strm.ReadInt(ref readerCtx);
                        // Create a temporary DataStreamWriter to keep our serialized pong message
                        var pongData = new DataStreamWriter(4, Allocator.Temp);
                        pongData.Write(id);
                        // Send the pong message with the same id as the ping
                        m_ServerDriver.Send(NetworkPipeline.Null, m_connections[i], pongData);
                    }
                    else if (cmd == NetworkEvent.Type.Disconnect)
                    {
                        // This connection no longer exist, remove it from the list
                        // The next iteration will operate on the new connection we swapped in so as long as it exist the
                        // loop can continue
                        m_connections.RemoveAtSwapBack(i);
                        if (i >= m_connections.Length)
                        {
                            break;
                        }
                    }
                }
            }
        }
コード例 #21
0
    void FixedUpdate()
    {
        // Update the ping client UI with the ping statistics computed by teh job scheduled previous frame since that
        // is now guaranteed to have completed
        PingClientUIBehaviour.UpdateStats(m_numPingsSent, m_lastPingTime);

        // Update the NetworkDriver. It schedules a job so we must wait for that job with Complete
        m_ClientDriver.ScheduleUpdate().Complete();

        // If the client ui indicates we should be sending pings but we do not have an active connection we create one
        if (PingClientUIBehaviour.ServerEndPoint.IsValid && !m_clientToServerConnection.IsCreated)
        {
            m_clientToServerConnection = m_ClientDriver.Connect(PingClientUIBehaviour.ServerEndPoint);
        }
        // If the client ui indicates we should not be sending pings but we do have a connection we close that connection
        if (!PingClientUIBehaviour.ServerEndPoint.IsValid && m_clientToServerConnection.IsCreated)
        {
            m_clientToServerConnection.Disconnect(m_ClientDriver);
            m_clientToServerConnection = default(NetworkConnection);
        }

        DataStreamReader strm;

        NetworkEvent.Type cmd;
        // Process all events on the connection. If the connection is invalid it will return Empty immediately
        while ((cmd = m_clientToServerConnection.PopEvent(m_ClientDriver, out strm)) != NetworkEvent.Type.Empty)
        {
            if (cmd == NetworkEvent.Type.Connect)
            {
                // When we get the connect message we can start sending data to the server
                // Set the ping id to a sequence number for the new ping we are about to send
                m_pendingPing = new PendingPing {
                    id = m_numPingsSent, time = Time.fixedTime
                };
                // Create a 4 byte data stream which we can store our ping sequence number in
                var pingData = new DataStreamWriter(4, Allocator.Temp);
                pingData.Write(m_numPingsSent);
                m_clientToServerConnection.Send(m_ClientDriver, pingData);
                // Update the number of sent pings
                ++m_numPingsSent;
            }
            else if (cmd == NetworkEvent.Type.Data)
            {
                // When the pong message is received we calculate the ping time and disconnect
                m_lastPingTime = (int)((Time.fixedTime - m_pendingPing.time) * 1000);
                m_clientToServerConnection.Disconnect(m_ClientDriver);
                m_clientToServerConnection = default(NetworkConnection);
            }
            else if (cmd == NetworkEvent.Type.Disconnect)
            {
                // If the server disconnected us we clear out connection
                m_clientToServerConnection = default(NetworkConnection);
            }
        }
    }
コード例 #22
0
    // Update is called once per frame
    void Update()
    {
        Driver.ScheduleUpdate().Complete();

        if (!Connection.IsCreated)
        {
            if (!Done)
            {
                Debug.Log("Somthing went wront during connect");

                return;
            }
        }

        DataStreamReader stream;

        NetworkEvent.Type netEvent;

        //  pops events for our single server connections
        while ((netEvent = Connection.PopEvent(Driver, out stream)) != NetworkEvent.Type.Empty)
        {
            //  NetworkEvent Connected
            //  Received a ConnectionAccepted message
            if (netEvent == NetworkEvent.Type.Connect)
            {
                Debug.Log("We are now connected to the server");

                uint value = 1;

                using (DataStreamWriter connectionWriter = new DataStreamWriter(4, Allocator.Temp))
                {
                    connectionWriter.Write(value);
                    Connection.Send(Driver, connectionWriter);
                }
            }

            //  NetworkEvent Data
            else if (netEvent == NetworkEvent.Type.Data)
            {
                DataStreamReader.Context readerContext = default(DataStreamReader.Context);
                uint value = stream.ReadUInt(ref readerContext);
                Debug.Log($"Got the value = {value} back from the server");
                Done = true;
                Connection.Disconnect(Driver);
                Connection = default(NetworkConnection);
            }

            //  Network Disconnect
            else if (netEvent == NetworkEvent.Type.Disconnect)
            {
                Debug.Log("Client got disconnected from server");
                Connection = default(NetworkConnection);
            }
        }
    }
コード例 #23
0
    // Update is called once per frame
    private void Update()
    {
        m_Driver.ScheduleUpdate().Complete();

        if (!m_Connection.IsCreated)
        {
            if (!Done)
            {
                Debug.Log("Something went wrong during connection");
            }

            return;
        }

        NetworkEvent.Type cmd;

        while ((cmd = m_Connection.PopEvent(m_Driver, out DataStreamReader stream)) != NetworkEvent.Type.Empty)
        {
            switch (cmd)
            {
            case NetworkEvent.Type.Connect:
                Debug.Log("We are now connected to the server.");
                var value = 1;

                using (var writer = new DataStreamWriter(4, Allocator.Temp))
                {
                    writer.Write(value);
                    m_Connection.Send(m_Driver, writer);
                }

                break;

            case NetworkEvent.Type.Data:
                var  readerCtx   = default(DataStreamReader.Context);
                uint streamValue = stream.ReadUInt(ref readerCtx);

                Debug.Log("Got the value = " + streamValue + " back from the server.");

                Done = true;
                m_Connection.Disconnect(m_Driver);
                m_Connection = default;

                break;

            case NetworkEvent.Type.Disconnect:
                Debug.Log("Client got disconnected from the server.");
                m_Connection = default;

                break;

            case NetworkEvent.Type.Empty:
                break;
            }
        }
    }
コード例 #24
0
    // Update is called once per frame
    void Update()
    {
        Driver.ScheduleUpdate().Complete();

        CleanConnections();

        AcceptConnections();

        UpdateClients();

        HandleConnections();
    }
コード例 #25
0
        public void DisconnectAndCleanup()
        {
            clientToServerConnection.Close(client_driver);

            //update drivers
            client_driver.ScheduleUpdate().Complete();
            server_driver.ScheduleUpdate().Complete();

            ev = server_driver.PopEventForConnection(connectionToClient, out stream);
            Assert.IsTrue(ev == NetworkEvent.Type.Disconnect, "NetworkEvent.Type.Disconnect was expected to appear, but " + ev + "appeared");

            server_driver.Dispose();
            client_driver.Dispose();
        }
コード例 #26
0
    protected override JobHandle OnUpdate(JobHandle inputDeps)
    {
        inputDeps.Complete();

        JobHandle clientJobHandle;

        if (!m_Driver.IsCreated)
        {
            ReliableUtility.Parameters reliabilityParams = new ReliableUtility.Parameters {
                WindowSize = 32
            };
            SimulatorUtility.Parameters simulatorParams = new SimulatorUtility.Parameters {
                MaxPacketSize = k_PacketSize, MaxPacketCount = 30, PacketDelayMs = 100
            };

            m_Driver = new UdpNetworkDriver(simulatorParams, reliabilityParams);

            m_Server_EndPoint      = NetworkEndPoint.LoopbackIpv4;
            m_Server_EndPoint.Port = 9000;
        }
        else
        {
            clientJobHandle = m_Driver.ScheduleUpdate(inputDeps);

            if (m_Server_EndPoint.IsValid && m_ConnectionGroup.IsEmptyIgnoreFilter)
            {
                //Debug.Log("client job handle about to be created");
                clientJobHandle = new SendConnectionRequestJob
                {
                    commandBuffer  = m_Barrier.CreateCommandBuffer(),
                    driver         = m_Driver,
                    serverEndPoint = m_Server_EndPoint,
                }.Schedule(clientJobHandle);
            }

            clientJobHandle.Complete();

            clientJobHandle = new UpdateClientJob
            {
                commandBuffer  = m_Barrier.CreateCommandBuffer().ToConcurrent(),
                driver         = m_Driver.ToConcurrent(),
                serverEndPoint = m_Server_EndPoint,
            }.Schedule(this, clientJobHandle);

            m_Barrier.AddJobHandleForProducer(clientJobHandle);

            return(clientJobHandle);
        }


        return(inputDeps);
    }
コード例 #27
0
    void Update()
    {
        m_Driver.ScheduleUpdate().Complete();

        if (!m_Connection.IsCreated)
        {
            if (!m_Done)
            {
                Debug.Log("Something went wrong during connect");
            }
            return;
        }

        DataStreamReader stream;

        NetworkEvent.Type cmd;

        while ((cmd = m_Connection.PopEvent(m_Driver, out stream)) !=
               NetworkEvent.Type.Empty)
        {
            if (cmd == NetworkEvent.Type.Connect)
            {
                Debug.Log("We are now connected to the server");

                CustomType customType = new CustomType()
                {
                    val = 1
                };
                var buff = cts.Serialize(customType);
                using (var writer = new DataStreamWriter(buff.Length, Allocator.Temp))
                {
                    writer.Write(buff);
                    m_Connection.Send(m_Driver, writer);
                }
            }
            else if (cmd == NetworkEvent.Type.Data)
            {
                var        readerCtx = default(DataStreamReader.Context);
                var        value     = stream.ReadBytesAsArray(ref readerCtx, stream.Length);
                CustomType ct        = cts.DeSerialize(value);
                Debug.Log("Got the value = " + ct.val + " back from the server");
                m_Done = true;
                m_Connection.Disconnect(m_Driver);
                m_Connection = default(NetworkConnection);
            }
            else if (cmd == NetworkEvent.Type.Disconnect)
            {
                Debug.Log("Client got disconnected from server");
                m_Connection = default(NetworkConnection);
            }
        }
    }
    void Update()
    {
        ClientJobHandle.Complete();
        var job = new ClientUpdateJob
        {
            driver     = m_Driver,
            pipeline   = m_Pipeline,
            connection = m_Connection,
            done       = m_Done
        };

        ClientJobHandle = m_Driver.ScheduleUpdate();
        ClientJobHandle = job.Schedule(ClientJobHandle);
    }
コード例 #29
0
        // Non-blocking; ticks ping state machine once
        //   3+ ticks required to do a full cycle (connect, send, receive + disconnect)
        void RunPingJob()
        {
            // Wait for existing job to finish
            updateHandle.Complete();

            // Write stats from last job
            Stats.AddEntry(m_NumPings[0], m_LastPing[0]);

            // Disconnect if we exceeded our disconnect timeout
            if (m_ClientToServerConnection.Length > 0 &&
                m_ClientToServerConnection[0].IsCreated &&
                m_NumPings[0] == m_PendingPings[0].id &&
                (Time.fixedTime - m_PendingPings[0].time > k_PingTimeoutMs))
            {
                Debug.Log($"Resetting connection to ping server due to ping timeout (time waiting for response > {k_PingTimeoutMs} ms).");
                m_ClientToServerConnection[0].Disconnect(m_ClientDriver);
                m_ClientToServerConnection[0] = default(NetworkConnection);
            }

            // Schedule driver update
            updateHandle = m_ClientDriver.ScheduleUpdate();

            var pingJob = new PingJob
            {
                driver       = m_ClientDriver,
                connection   = m_ClientToServerConnection,
                serverEp     = m_ServerEndpoint,
                pendingPings = m_PendingPings,
                numPings     = m_NumPings,
                lastPing     = m_LastPing
            };

            // Schedule an update chain with the driver update followed by the ping job
            updateHandle = pingJob.Schedule(updateHandle);

            JobHandle.ScheduleBatchedJobs();
        }
コード例 #30
0
    void Update()
    {
        clientJobHandle.Complete();
        ClientUpdateJob job = new ClientUpdateJob
        {
            driver             = m_Driver,
            connection         = m_Connection,
            done               = m_Done,
            unreliablePipeline = m_Unreliable_Pipeline,
            reliablePipeline   = m_Reliable_Pipeline
        };

        clientJobHandle = m_Driver.ScheduleUpdate();
        //clientJobHandle = job.Schedule(clientJobHandle);
    }