コード例 #1
0
    void AcceptConnections()
    {
        //  Accepts the new Connections
        NetworkConnection connection;

        while ((connection = Driver.Accept()) != default(NetworkConnection))
        {
            Connections.Add(connection);
            //players.Add(new ClientPlayer(connection.GetHashCode()));
            //Debug.Log($"Player Id: {connection.GetHashCode()}");
            Debug.Log("Server: Accepted a connection");

            using (DataStreamWriter writer = new DataStreamWriter(16, Allocator.Temp))
            {
                writer.Write((int)ServerDataType.IdAssignment);
                writer.Write(IdCount);
                Driver.Send(NetworkPipeline.Null, connection, writer);

                Debug.Log($"Server: Sent client id: {IdCount}");
            }

            Vector3    spawnPos = new Vector3(0.0f, 4.0f, 0.0f);
            Quaternion spawnRot = new Quaternion(0.0f, 0.0f, 0.0f, 0.0f);

            ClientObjects.Add(IdCount, Instantiate(PlayerPreFab, spawnPos, spawnRot));
            ClientObjectFired.Add(IdCount, new FiredBool());

            IdCount++;
        }
    }
コード例 #2
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;
                        }
                    }
                }
            }
        }
コード例 #3
0
    //private void FlushConnection(NetworkConnection m_con2)
    //{
    //    //Send info to client
    //    //ReadAll from client
    //    //deactivate Game
    //    throw new NotImplementedException();
    //}

    void NewGameStartProcess(NetworkConnection con, ref ActivGamePlayerState playerState)
    {
        using (var writer = new DataStreamWriter(8, Allocator.Temp))
        {
            writer.Write(m_id);
            m_driver.Send(NetworkPipeline.Null, con, writer);
            Debug.Log("Send NewGameStartProcess");
        }
        playerState = ActivGamePlayerState.WaitingTurn;
    }
コード例 #4
0
    private void QueryForNewEvents()
    {
        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.");
                    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 server");
                    m_Connections[i] = default(NetworkConnection);
                }
            }
        }
    }
コード例 #5
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;
                }
            }
        }
    }
コード例 #6
0
ファイル: Server.cs プロジェクト: aaronvark/KGDEV4-Examples
 IEnumerator SendHelloClient(NetworkConnection c)
 {
     for (int x = 0; x < 512; ++x)
     {
         using (var writer = PacketFunctions.WriteHelloClientPacket()) {
             //m_Driver.Send(reliableUdpPipe, c, writer);
             m_Driver.Send(NetworkPipeline.Null, c, writer);
         }
         yield return(null);
     }
 }
コード例 #7
0
    protected override void Write(ref UdpNetworkDriver m_Driver, NetworkConnection networkConnection)
    {
        foreach (var sender in Senders)
        {
            var writer = sender.GetNew();

            writer.Write(sender.Id);
            sender.Write(writer);

            m_Driver.Send(NetworkPipeline.Null, networkConnection, writer);
            writer.Dispose();
        }
    }
コード例 #8
0
        //Process any
        void processNetworkEvents()
        {
            DataStreamReader stream;                            //Used for reading data from data network events

            for (int i = 0; i < networkConnections.Length; i++) //For each active connection
            {
                if (!networkConnections[i].IsCreated)
                {
                    Assert.IsTrue(true);
                }

                //Get network events for the connection
                NetworkEvent.Type networkEvent;
                while ((networkEvent = networkDriver.PopEventForConnection(networkConnections[i], out stream)) !=
                       NetworkEvent.Type.Empty)
                {
                    if (networkEvent == NetworkEvent.Type.Data) //Connection sent data
                    {
                        //Tracks where in the data stream you are and how much you've read
                        var readerContext = default(DataStreamReader.Context);

                        #region Custom Data Processing

                        //Attempt to read uint from stream
                        uint number   = stream.ReadUInt(ref readerContext);
                        int  dataSize = 4; //Size of data being sent in bytes

                        Debug.Log("Got " + number + " from the Client adding + 2 to it.");
                        number += 2;

                        //DataStreamWriter is needed to send data
                        //using statement makes sure DataStreamWriter memory is disposed
                        using (var writer = new DataStreamWriter(dataSize, Allocator.Temp))
                        {
                            writer.Write(number);                                               //Write response data
                            networkDriver.Send(networkPipeline, networkConnections[i], writer); //Send response data to client
                        }

                        #endregion Custom Data Processing
                    }
                    else if (networkEvent == NetworkEvent.Type.Disconnect) //Connection disconnected
                    {
                        Debug.Log("Client disconnected from server");
                        //This ensures the connection will be cleaned up in cleanupConnections()
                        networkConnections[i] = default(NetworkConnection);
                    }
                }
            }
        }
コード例 #9
0
    void AcceptConnections()
    {
        Debug.Log($"Server: Accepting Connections");

        //  Accepts the new Connections
        NetworkConnection connection;

        while ((connection = Driver.Accept()) != default(NetworkConnection))
        {
            Connections.Add(connection);
            //players.Add(new ClientPlayer(connection.GetHashCode()));
            //Debug.Log($"Player Id: {connection.GetHashCode()}");
            Debug.Log("Server: Accepted a connection");

            using (DataStreamWriter writer = new DataStreamWriter(16, Allocator.Temp))
            {
                writer.Write((int)ServerDataType.IdAssignment);
                writer.Write(IdCount);
                Driver.Send(NetworkPipeline.Null, connection, writer);

                Debug.Log($"Server: Sent client id: {IdCount}");
            }

            Vector3    spawnPos = new Vector3(0.0f, 4.0f, 0.0f);
            Quaternion spawnRot = new Quaternion(0.0f, 0.0f, 0.0f, 0.0f);

            ClientState newState = new ClientState();
            newState.PlayerPosition = spawnPos;
            newState.PlayerRotation = spawnRot;
            newState.Health         = 10;

            ClientStates.Add(IdCount, newState);

            IdCount++;
        }
    }
コード例 #10
0
    void FixedUpdate()
    {
        // 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);
            // Debug.Log("Connected is " + con.InternalId);
            // var idData = new DataStreamWriter(4, Allocator.Temp);
            //  idData.Write(con.InternalId);
            // DataStreamReader strm;

            // m_ServerDriver.PopEventForConnection(con, out strm);
            //m_ServerDriver.Send(NetworkPipeline.Null, con, idData);
        }
        List <Player> clientList = ServerManager.GetClients();

        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)
                {
                    var  readerCtx = default(DataStreamReader.Context);
                    byte data      = strm.ReadByte(ref readerCtx);
                    CMD  command   = (CMD)data;
                    switch (command)
                    {
                    case CMD.CONNECT:
                        var id = ServerManager.RegisterPlayer(m_connections[i].InternalId);
                        Debug.Log("Connected " + id);
                        byte[] idData = NetworkLayer.newCommand(CMD.CONNECT, BitConverter.GetBytes(id));
                        var    newID  = new DataStreamWriter(idData.Length, Allocator.Temp);
                        newID.Write(idData);
                        m_ServerDriver.Send(NetworkPipeline.Null, m_connections[i], newID);
                        break;

                    case CMD.PLAYER_UPDATE:
                        byte[] playerByte = strm.ReadBytesAsArray(ref readerCtx, 32);
                        var    player     = ByteConverter.toPlayer(playerByte);
                        ServerManager.OnUpdatePlayer(player);
                        break;

                    case CMD.SHOOT:
                        var shootBye  = NetworkLayer.newCommand(CMD.SHOOT, BitConverter.GetBytes(m_connections[i].InternalId));
                        var shootData = new DataStreamWriter(shootBye.Length, Allocator.Temp);
                        shootData.Write(shootBye);
                        for (int y = 0; y < m_connections.Length; ++y)
                        {
                            if (m_connections[i] != m_connections[y])
                            {
                                m_ServerDriver.Send(NetworkPipeline.Null, m_connections[y], shootData);
                            }
                        }
                        ;
                        break;

                    case CMD.PLAYER_DIE:
                        Debug.LogWarning(" S DIE");
                        var dieByte = NetworkLayer.newCommand(CMD.PLAYER_DIE, BitConverter.GetBytes(m_connections[i].InternalId));
                        var dieData = new DataStreamWriter(dieByte.Length, Allocator.Temp);
                        dieData.Write(dieByte);
                        for (int y = 0; y < m_connections.Length; ++y)
                        {
                            m_ServerDriver.Send(NetworkPipeline.Null, m_connections[y], dieData);
                        }
                        ;
                        break;
                    }
                    for (int clientIndex = 0; clientIndex < clientList.Count; clientIndex++)
                    {
                        byte[] playerData = NetworkLayer.newCommand(CMD.PLAYER_UPDATE, ByteConverter.playerToByte(clientList[clientIndex]));
                        var    player     = new DataStreamWriter(playerData.Length, Allocator.Temp);
                        player.Write(playerData);
                        m_ServerDriver.Send(NetworkPipeline.Null, m_connections[i], player);
                    }
                    ;

                    // Send the pong message with the same id as the ping
                }
                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
                    Debug.Log("Desconnected " + m_connections[i].InternalId);
                    byte[] disconnectData = NetworkLayer.newCommand(CMD.PLAYER_DISCONNECTED, BitConverter.GetBytes(m_connections[i].InternalId));
                    var    player         = new DataStreamWriter(disconnectData.Length, Allocator.Temp);
                    player.Write(disconnectData);
                    ServerManager.OnDisconnectPlayer(m_connections[i].InternalId);
                    m_connections.RemoveAtSwapBack(i);
                    for (int y = 0; y < m_connections.Length; ++y)
                    {
                        m_ServerDriver.Send(NetworkPipeline.Null, m_connections[y], player);
                    }
                    ;
                    if (i >= m_connections.Length)
                    {
                        break;
                    }
                }
            }
        }
    }
コード例 #11
0
        public void SendAndReceiveMessage_RealNetwork()
        {
            using (var clientSendData = new DataStreamWriter(64, Allocator.Persistent))
            {
                DataStreamReader stream;
                var serverEndpoint = NetworkEndPoint.LoopbackIpv4;
                serverEndpoint.Port = (ushort)Random.Range(2000, 65000);

                var serverDriver = new UdpNetworkDriver(new NetworkDataStreamParameter {
                    size = 64
                });
                serverDriver.Bind(serverEndpoint);

                serverDriver.Listen();

                var clientDriver = new UdpNetworkDriver(new NetworkDataStreamParameter {
                    size = 64
                });
                clientDriver.Bind(NetworkEndPoint.LoopbackIpv4);

                var clientToServerId = clientDriver.Connect(serverEndpoint);

                NetworkConnection serverToClientId = default(NetworkConnection);
                // Retry a few times since the network might need some time to process
                for (int i = 0; i < 10 && serverToClientId == default(NetworkConnection); ++i)
                {
                    serverDriver.ScheduleUpdate().Complete();

                    serverToClientId = serverDriver.Accept();
                }

                Assert.That(serverToClientId != default(NetworkConnection));

                clientDriver.ScheduleUpdate().Complete();

                var eventId = clientDriver.PopEventForConnection(clientToServerId, out stream);
                Assert.That(eventId == NetworkEvent.Type.Connect);


                int    testInt       = 100;
                float  testFloat     = 555.5f;
                byte[] testByteArray = Encoding.ASCII.GetBytes("Some bytes blablabla 1111111111111111111");
                clientSendData.Write(testInt);
                clientSendData.Write(testFloat);
                clientSendData.Write(testByteArray.Length);
                clientSendData.Write(testByteArray);
                var sentBytes = clientDriver.Send(NetworkPipeline.Null, clientToServerId, clientSendData);

                // Header size is included in the sent bytes count (4 bytes overhead)
                Assert.AreEqual(clientSendData.Length + 4, sentBytes);

                clientDriver.ScheduleUpdate().Complete();
                serverDriver.ScheduleUpdate().Complete();

                DataStreamReader serverReceiveStream;
                eventId = serverDriver.PopEventForConnection(serverToClientId, out serverReceiveStream);
                var readerCtx = default(DataStreamReader.Context);

                Assert.True(eventId == NetworkEvent.Type.Data);
                var receivedInt     = serverReceiveStream.ReadInt(ref readerCtx);
                var receivedFloat   = serverReceiveStream.ReadFloat(ref readerCtx);
                var byteArrayLength = serverReceiveStream.ReadInt(ref readerCtx);
                var receivedBytes   = serverReceiveStream.ReadBytesAsArray(ref readerCtx, byteArrayLength);

                Assert.True(testInt == receivedInt);
                Assert.That(Mathf.Approximately(testFloat, receivedFloat));
                Assert.AreEqual(testByteArray, receivedBytes);

                clientDriver.Dispose();
                serverDriver.Dispose();
            }
        }
コード例 #12
0
    // Update is called once per frame
    void Update()
    {
        Driver.ScheduleUpdate().Complete();

        //  cleanes up old state connections
        //  before processing new ones
        for (int connection_i = 0; connection_i < Connections.Length; connection_i++)
        {
            if (!Connections[connection_i].IsCreated)
            {
                Connections.RemoveAtSwapBack(connection_i);
                --connection_i;
            }
        }

        //  Accepts the new connections
        NetworkConnection connection;

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

        //  Connections are now up to date, so now we are
        //  querying for events that might have happened sincd last event
        DataStreamReader stream;

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

            //  while there are more events needed to process, we will keep popping
            //  events for connection
            NetworkEvent.Type netEvent;
            while ((netEvent = Driver.PopEventForConnection(Connections[connection_i], out stream)) != NetworkEvent.Type.Empty)
            {
                //  This is where we will process different types of events

                //  Date Event
                if (netEvent == NetworkEvent.Type.Data)
                {
                    DataStreamReader.Context readerContext = default(DataStreamReader.Context);
                    uint number = stream.ReadUInt(ref readerContext);

                    Debug.Log("Got " + number + " from the Client adding + 2 to it.");
                    number += 2;

                    using (DataStreamWriter connectionWriter = new DataStreamWriter(4, Allocator.Temp))
                    {
                        connectionWriter.Write(number);
                        Driver.Send(NetworkPipeline.Null, Connections[connection_i], connectionWriter);
                    }
                }

                //  Disconnect Event
                else if (netEvent == NetworkEvent.Type.Disconnect)
                {
                    Debug.Log("Client disconnected from server");
                    Connections[connection_i] = default(NetworkConnection);
                }
            }
        }
    }
コード例 #13
0
 public void Write(DataStreamWriter writer, NetworkConnection connection)
 {
     m_Driver.Send(NetworkPipeline.Null, connection, writer);
     writer.Dispose();
 }