Example #1
0
        /// <summary>
        /// Reads network events and delegates how they are used
        /// </summary>
        public static void PollEvents()
        {
            // If nothing is running, why bother
            if (mServers.Count < 1 && mClients.Count < 1)
            {
                return;
            }

            int recHostId;
            int connectionId;
            int channelId;
            int dataSize;

            byte[] buffer = new byte[1024];
            byte   error;

            NetworkEventType networkEvent = NetworkEventType.DataEvent;

            // Process network events for n clients and n servers
            while (mIsInitialized && networkEvent != NetworkEventType.Nothing)
            {
                int i = -1;                 // Index for netserver in mservers

                networkEvent = NetworkTransport.Receive(out recHostId, out connectionId, out channelId, buffer, 1024, out dataSize, out error);

                // Route message to our server delegate
                i = mServers.FindIndex(x => x.mSocket == recHostId);
                if (i != -1)
                {
                    if (mServers[i].OnMessage != null)
                    {
                        mServers[i].OnMessage(networkEvent, connectionId, channelId, buffer, dataSize);
                    }
                }

                // Route message to our client delegate
                // Client Connect Event
                i = mClients.FindIndex(c => c.mSocket.Equals(recHostId));
                if (i != -1)
                {
                    if (mClients[i].OnMessage != null)
                    {
                        mClients[i].OnMessage(networkEvent, connectionId, channelId, buffer, dataSize);
                    }
                }

                switch (networkEvent)
                {
                // Nothing
                case NetworkEventType.Nothing:
                    break;

                // Connect
                case NetworkEventType.ConnectEvent:

                    // Server Connect Event
                    i = mServers.FindIndex(s => s.mSocket.Equals(recHostId));

                    if (i != -1)
                    {
                        mServers[i].AddClient(connectionId);
                        if (mServers[i].OnConnection != null)
                        {
                            mServers[i].OnConnection(connectionId, channelId, buffer, dataSize);
                        }
                    }

                    // Client Connect Event
                    i = mClients.FindIndex(c => c.mSocket.Equals(recHostId));
                    if (i != -1)
                    {
                        mClients[i].mIsConnected = true;                         // Set client connected to true
                        if (mClients[i].OnConnection != null)
                        {
                            mClients[i].OnConnection(connectionId, channelId, buffer, dataSize);
                        }
                    }

                    break;

                // Data
                case NetworkEventType.DataEvent:

                    // Server received data
                    i = mServers.FindIndex(x => x.mSocket == recHostId);
                    if (i != -1)
                    {
                        if (mServers[i].OnData != null)
                        {
                            mServers[i].OnData(connectionId, channelId, buffer, dataSize);
                        }
                    }

                    // Client Received Data
                    i = mClients.FindIndex(c => c.mSocket.Equals(recHostId));
                    if (i != -1)
                    {
                        if (mClients[i].OnData != null)
                        {
                            mClients[i].OnData(connectionId, channelId, buffer, dataSize);
                        }
                    }
                    break;

                // Disconnect
                case NetworkEventType.DisconnectEvent:

                    // Server Disconnect Event
                    i = mServers.FindIndex(x => x.mSocket == recHostId);
                    if (i != -1)
                    {
                        mServers[i].RemoveClient(connectionId);
                        if (mServers[i].OnDisconnection != null)
                        {
                            mServers[i].OnDisconnection(connectionId, channelId, buffer, dataSize);
                        }
                    }

                    // Client Disconnect Event
                    i = mClients.FindIndex(c => c.mSocket.Equals(recHostId));
                    if (i != -1)
                    {
                        mClients[i].mIsConnected = false;                         // Set client connected to true
                        if (mClients[i].OnDisconnection != null)
                        {
                            mClients[i].OnDisconnection(connectionId, channelId, buffer, dataSize);
                        }
                    }


                    break;
                }
            }
        }
Example #2
0
 void Destroy()
 {
     NetworkTransport.Shutdown();
 }
Example #3
0
 public void Stop()
 {
     ServerStarted = false;
     NetworkTransport.RemoveHost(m_hostID);
 }
Example #4
0
    // Update is called once per frame
    void Update()
    {
        // Incoming Connection IDs
        int incomingSocketID     = -1;
        int incomingConnectionID = -1;
        int incomingChannelID    = -1;

        byte[] incomingMessageBuffer = new byte[_incomingBufferSize];
        int    dataSize = 0;
        byte   error;

        NetworkEventType incomingNetworkEvent = NetworkTransport.Receive(out incomingSocketID, out incomingConnectionID,
                                                                         out incomingChannelID, incomingMessageBuffer, _incomingBufferSize, out dataSize, out error);

        switch (incomingNetworkEvent)
        {
        case NetworkEventType.Nothing:
            break;

        case NetworkEventType.ConnectEvent:
            Debug.Log("Master Server: new client connected");
            ++_numberOfConnections;
            break;

        case NetworkEventType.DataEvent:

            string message = Encoding.UTF8.GetString(incomingMessageBuffer);
            int    prefix  = 0;
            int    index;
            string newMessage = "";

            // New parser now allows client commands to be > 1 digit
            for (index = 0; index < message.Length; ++index)
            {
                if (message[index] == '{')
                {
                    break;
                }
            }

            prefix     = Convert.ToInt32(message.Substring(0, index));
            newMessage = message.Substring(index);

            // Have game servers register themselves.
            if (prefix == (int)MasterServerCommands.RegisterGameServer)
            {
                Debug.Log("register a server");

                foreach (KeyValuePair <string, GameInstanceStats> instance in _gameInstances)
                {
                    if (instance.Value.serverID == 0)
                    {
                        instance.Value.serverID     = JsonUtility.FromJson <PortID>(newMessage).portID;
                        instance.Value.socketID     = incomingSocketID;
                        instance.Value.connectionID = incomingConnectionID;
                        instance.Value.channelID    = incomingChannelID;
                        break;
                    }
                }
            }

            else if (prefix == (int)MasterServerCommands.RegisterClient)
            {
                if (!_clients.ContainsKey(incomingConnectionID))
                {
                    ClientInfo clientInfo = new ClientInfo(incomingSocketID, incomingConnectionID, incomingChannelID);
                    _clients.Add(incomingConnectionID, clientInfo);
                    Debug.Log(incomingConnectionID + " added to _clients");
                }
            }

            //process login info
            else if (prefix == (int)MasterServerCommands.C_VerifyLogin)
            {
                LoginInfo info = JsonUtility.FromJson <LoginInfo>(newMessage);
                StartCoroutine(verifyLogin(info.username, info.password, incomingSocketID, incomingConnectionID, incomingChannelID));
            }

            //process create account info
            else if (prefix == (int)MasterServerCommands.C_CreateAccount)
            {
                LoginInfo info = JsonUtility.FromJson <LoginInfo>(newMessage);
                StartCoroutine(CreateUser(info.username, info.password, incomingSocketID, incomingConnectionID, incomingChannelID));
            }

            // Process game connection requests
            else if (prefix == (int)MasterServerCommands.C_SelectGameInstance)
            {
                string serverName = JsonUtility.FromJson <ServerInfo>(newMessage).servername;

                if (_gameInstances.ContainsKey(serverName.ToLower()))
                {
                    // Connect client to an already existing game server.
                    if (_gameInstances[serverName].inGamePlayers < 4 && _gameInstances[serverName].openToConnections == true)
                    {
                        // Tells client that game is being created
                        string jsonToBeSent = "13";
                        jsonToBeSent += JsonUtility.ToJson("");
                        byte[] messageBuffer = Encoding.UTF8.GetBytes(jsonToBeSent);
                        NetworkTransport.Send(incomingSocketID, incomingConnectionID, incomingChannelID, messageBuffer, messageBuffer.Length, out error);

                        Debug.Log("Forwarding player to already established game: " + serverName);
                        StartCoroutine(ForwardPlayerToGame(serverName.ToLower(), _clients[incomingConnectionID]));
                    }
                    else
                    {
                        Debug.Log("In Game Players: " + _gameInstances[serverName].inGamePlayers);
                        Debug.Log("Open to new connections? " + _gameInstances[serverName].openToConnections);
                        string jsonToBeSent = "12";
                        jsonToBeSent += JsonUtility.ToJson("");
                        byte[] messageBuffer = Encoding.UTF8.GetBytes(jsonToBeSent);
                        NetworkTransport.Send(incomingSocketID, incomingConnectionID, incomingChannelID, messageBuffer, messageBuffer.Length, out error);
                    }
                }
                else
                {
                    if (_numberOfGameInstances == _maxGameInstances)
                    {
                        Debug.Log("Maximum game instances reached.");
                        MaximumInstancesReached(_gameInstances, _clients[incomingConnectionID]);
                    }
                    else
                    {
                        // Create an instance of a game and have the client connect.
                        _numberOfGameInstances++;
                        _gameInstances.Add(serverName.ToLower(), new GameInstanceStats(serverName.ToLower()));
                        if (_enableAutomaticServerInstanceExecute)
                        {
                            System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
                            startInfo.FileName = _GameInstancePath;
                            System.Diagnostics.Process.Start(startInfo);
                        }

                        // Tells client that game is being created
                        string jsonToBeSent = "13";
                        jsonToBeSent += JsonUtility.ToJson("");
                        byte[] messageBuffer = Encoding.UTF8.GetBytes(jsonToBeSent);
                        NetworkTransport.Send(incomingSocketID, incomingConnectionID, incomingChannelID, messageBuffer, messageBuffer.Length, out error);

                        // Forwards player to game
                        StartCoroutine(ForwardPlayerToGameWithDelay(serverName.ToLower(), _clients[incomingConnectionID]));
                    }
                }
            }
            else if (prefix == (int)MasterServerCommands.VerifyOccupancy)
            {
                int    inGamePlayers = JsonUtility.FromJson <GameServerInfo>(newMessage).inGamePlayers;
                string serverName    = JsonUtility.FromJson <GameServerInfo>(newMessage).serverName;
                Debug.Log("Verify Occupancy: " + serverName);
                _gameInstances[serverName.ToLower()].inGamePlayers = inGamePlayers;
            }
            else if (prefix == (int)MasterServerCommands.GS_openToConnections)
            {
                GameInstanceStats gs = JsonUtility.FromJson <GameInstanceStats>(newMessage);
                Debug.Log("OpenToConnections message received | " + gs.serverName);
                _gameInstances[gs.serverName.ToLower()].openToConnections = true;
            }
            else if (prefix == (int)MasterServerCommands.GS_closedToConnections)
            {
                GameInstanceStats gs = JsonUtility.FromJson <GameInstanceStats>(newMessage);
                Debug.Log("closedToConnections message received | " + gs.serverName);
                _gameInstances[gs.serverName.ToLower()].openToConnections = false;
            }


            break;

        case NetworkEventType.DisconnectEvent:
            _numberOfConnections = --_numberOfConnections < 0 ? 0 : _numberOfConnections;
            if (_activeusernames.Contains(_clients[incomingConnectionID].username))
            {
                _activeusernames.Remove(_clients[incomingConnectionID].username);
            }

            break;
        }
    }
Example #5
0
    void Awake()
    {
        try
        {
            NetworkTransport.Init();

            serverConfig    = new ConnectionConfig();
            serverChannelId = serverConfig.AddChannel(QosType.StateUpdate); // QosType.UnreliableFragmented
            serverConfig.MaxSentMessageQueueSize = 2048;                    // 128 by default

            // start data server
            serverTopology = new HostTopology(serverConfig, maxConnections);
            serverHostId   = NetworkTransport.AddHost(serverTopology, listenOnPort);

            if (serverHostId < 0)
            {
                throw new UnityException("AddHost failed for port " + listenOnPort);
            }

            // add broadcast host
            if (broadcastPort > 0)
            {
                broadcastHostId = NetworkTransport.AddHost(serverTopology, 0);

                if (broadcastHostId < 0)
                {
                    throw new UnityException("AddHost failed for broadcast discovery");
                }
            }

            // set broadcast data
            string sBroadcastData = string.Empty;

#if !UNITY_WSA
            try
            {
                string      strHostName = System.Net.Dns.GetHostName();
                IPHostEntry ipEntry     = Dns.GetHostEntry(strHostName);
                IPAddress[] addr        = ipEntry.AddressList;

                string sHostInfo = "Host: " + strHostName;
                for (int i = 0; i < addr.Length; i++)
                {
                    if (addr[i].AddressFamily == AddressFamily.InterNetwork)
                    {
                        sHostInfo     += ", IP: " + addr[i].ToString();
                        sBroadcastData = "KinectDataServer:" + addr[i].ToString() + ":" + listenOnPort;
                        break;
                    }
                }

                sHostInfo += ", Port: " + listenOnPort;
                Debug.Log(sHostInfo);

                if (serverStatusText)
                {
                    serverStatusText.text = sHostInfo;
                }
            }
            catch (System.Exception ex)
            {
                Debug.LogError(ex.Message + "\n\n" + ex.StackTrace);

                if (serverStatusText)
                {
                    serverStatusText.text = "Use 'ipconfig' to see the host IP; Port: " + listenOnPort;
                }
            }
#else
            sBroadcastData = "KinectDataServer:" + "127.0.0.1" + ":" + listenOnPort;
#endif

            // start broadcast discovery
            if (broadcastPort > 0)
            {
                broadcastOutBuffer = System.Text.Encoding.UTF8.GetBytes(sBroadcastData);
                byte error = 0;

                if (!NetworkTransport.StartBroadcastDiscovery(broadcastHostId, broadcastPort, 8888, 1, 0, broadcastOutBuffer, broadcastOutBuffer.Length, 2000, out error))
                {
                    throw new UnityException("Start broadcast discovery failed: " + (NetworkError)error);
                }
            }

            liRelTime    = 0;
            fCurrentTime = Time.time;

            System.DateTime dtNow = System.DateTime.UtcNow;
            Debug.Log("Kinect data server started at " + dtNow.ToString() + " - " + dtNow.Ticks);

            if (connStatusText)
            {
                connStatusText.text = "Server running: 0 connection(s)";
            }
        }
        catch (System.Exception ex)
        {
            Debug.LogError(ex.Message + "\n" + ex.StackTrace);

            if (connStatusText)
            {
                connStatusText.text = ex.Message;
            }
        }
    }
 public void Shutdown()
 {
     isStarted = false;
     NetworkTransport.Shutdown();
 }
Example #7
0
 public void InitNetworkTransport()
 {
     NetworkTransport.Init();
 }
Example #8
0
 // Use this for initialization
 void Start()
 {
     NetworkTransport.Init();
 }
Example #9
0
 public void Disconnect()
 {
     NetworkTransport.Disconnect(hostID, connectionID, out error);
 }
Example #10
0
 public void ServerStop()
 {
     NetworkTransport.RemoveHost(serverHostId);
     serverHostId = -1;
     Debug.Log("LLAPITransport.ServerStop");
 }
Example #11
0
    private void Update()
    {
        if (!is_started)
        {
            return;
        }
        int recHostId;
        int connectionId;
        int channelId;

        byte[]           recBuffer  = new byte[1024];
        int              bufferSize = 1024;
        int              dataSize;
        byte             error;
        NetworkEventType recData = NetworkTransport.Receive(out recHostId, out connectionId, out channelId, recBuffer, bufferSize, out dataSize, out error);

        switch (recData)
        {
        case NetworkEventType.ConnectEvent:
            Debug.Log("Player:" + connectionId + " has connected!");
            Onconnection(connectionId);
            break;

        case NetworkEventType.DataEvent:
            string msg = Encoding.Unicode.GetString(recBuffer, 0, dataSize);
            //Debug.Log("Receiving from" + connectionId + " : " + msg);
            //Debug.Log("length is: " + msg.Length);
            string[] splitData = msg.Split('|');

            switch (splitData[0])
            {
            case "NAMEIS":
                OnNameIs(connectionId, splitData[1]);
                break;

            case "MYROT":
                OnMyRot(connectionId, splitData[1]);
                break;

            case "CALIS":
                OnCALIS(connectionId, splitData[1]);
                break;

            default:
                Debug.Log("Invalid Message : " + msg);
                break;
            }
            break;

            break;

        case NetworkEventType.DisconnectEvent:
            OnDisconnection(connectionId);
            Debug.Log("Player:" + connectionId + " has disconnected");
            break;

        case NetworkEventType.BroadcastEvent:

            break;
        }
        //Ask for rotation update
        if (BoradCasting)
        {
            if (Time.time - lastRotationUpdate > UpdateRate)
            {
                if (BoradCasting_Changed)
                {
                    Send("ONBC|", ReliableChannel, clients);
                    BoradCasting_Changed = false;
                }
                lastRotationUpdate = Time.time;
                string     m           = "ROT|";
                GameObject datamanager = GameObject.Find("DataManager");
                Quaternion data        = datamanager.GetComponent <DataManager>().RealSense_Rotation;
                m   += data.x.ToString() + '%' + data.y.ToString() + '%' + data.z.ToString() + '%' + data.w.ToString() + '%';
                data = datamanager.GetComponent <DataManager>().Inertia_Rotation;
                m   += data.x.ToString() + '%' + data.y.ToString() + '%' + data.z.ToString() + '%' + data.w.ToString() + '%';
                m   += '|';
                Send(m, UnreliableChannel, clients);
            }
        }
        if (!BoradCasting)
        {
            if (BoradCasting_Changed)
            {
                Send("OFFBC|", ReliableChannel, clients);
                BoradCasting_Changed = false;
            }
        }
    }
Example #12
0
 public float ClientGetRTT()
 {
     return(NetworkTransport.GetCurrentRTT(clientId, clientConnectionId, out error));
 }
Example #13
0
    private void Update()
    {
        if (!isConnected)
        {
            return;
        }

        int recHostId;
        int connectionId;
        int channelId;

        byte[]           recBuffer  = new byte[1024];
        int              bufferSize = 1024;
        int              dataSize;
        byte             error;
        NetworkEventType recData = NetworkTransport.Receive(out recHostId, out connectionId, out channelId, recBuffer, bufferSize, out dataSize, out error);

        switch (recData)
        {
        case NetworkEventType.DataEvent:
            string msg = Encoding.Unicode.GetString(recBuffer, 0, dataSize);

            //Debug.Log ("Receiving : " + msg);

            string[] splitData = msg.Split('|');
            //Filter out asking for coordinate updates, cluttering up debug log
            if (splitData[0] != "ASKPOSITION" && splitData[0] != "ASKROTATION")
            {
                Debug.Log("Receiving from server: " + msg);
            }

            switch (splitData[0])
            {
            case "ASKNAME":
                OnAskName(splitData);
                break;

            case "CNN":
                SpawnPlayer(splitData [1], int.Parse(splitData [2]));
                break;

            case "DC":
                PlayerDisconnected(int.Parse(splitData[1]));
                break;

            case "ASKPOSITION":
                OnAskPosition(splitData);
                break;

            case "ASKROTATION":
                OnAskRotation(splitData);
                break;

            case "ASKANIMATION":
                OnAskAnimation(splitData);
                break;

            case "ASKCURRENTHEALTH":
                OnAskCurrentHealth(splitData);
                break;

            case "PROJECTILESPAWNED":
                OnProjectileWasSpawned(splitData);
                break;

            default:
                Debug.Log("Invalid message : " + msg);
                break;
            }

            break;
        }
    }
Example #14
0
        /// <summary>
        /// Initialize our low level network APIs.
        /// </summary>
        public static void Init()
        {
            NetworkTransport.Init(mGlobalConfig);

            mIsInitialized = true;
        }
Example #15
0
 public override bool ServerDisconnect(int connectionId)
 {
     return(NetworkTransport.Disconnect(serverHostId, connectionId, out error));
 }
Example #16
0
 public void sendMessage(string message)
 {
     byte[] buffer = Encoding.Unicode.GetBytes(message);
     NetworkTransport.Send(hostID, connectionID, reliableChannelID, buffer, message.Length * sizeof(char), out error);
 }
Example #17
0
 void Awake()
 {
     NetworkTransport.Init(globalConfig);
     Debug.Log("LLAPITransport initialized!");
 }
Example #18
0
    void fresh()
    {
        int              outHostId;
        int              outConnectionId;
        int              outChannelId;
        string           outConnIp;
        int              outPort;
        NetworkID        outID;
        NodeID           outNode;
        int              receivedSize;
        byte             error;
        int              quesize;
        NetworkEventType evt;
        int              dog = 0;

        do
        {
            dog++;

            evt =
                NetworkTransport.Receive(out outHostId, out outConnectionId, out outChannelId, buffer, buffer.Length, out receivedSize, out error);
            quesize = NetworkTransport.GetIncomingMessageQueueSize(outHostId, out error);
            if (error != 0)
            {
                Debug.LogError("Receive error=" + error + "quesize=" + quesize);
            }
            switch (evt)
            {
            case NetworkEventType.ConnectEvent:
            {
                NetworkTransport.GetConnectionInfo(outHostId, outConnectionId, out outConnIp, out outPort, out outID, out outNode, out error);
                connectionClient.Add(outConnectionId, new StrTxt(Instantiate(text), outConnIp, true));
                OnConnect(outHostId, outConnectionId, (NetworkError)error);
                break;
            }

            case NetworkEventType.DisconnectEvent:
            {
                OnDisconnect(outHostId, outConnectionId, (NetworkError)error);
                break;
            }

            case NetworkEventType.DataEvent:
            {
                OnData(outHostId, outConnectionId, outChannelId, ref buffer, receivedSize, (NetworkError)error);
                break;
            }

            case NetworkEventType.BroadcastEvent:
            {
                OnBroadcast(outHostId, buffer, receivedSize, (NetworkError)error);
                break;
            }

            case NetworkEventType.Nothing:
                break;

            default:
                Debug.LogError("Unknown network message type received: " + evt);
                break;
            }
        }while (dog < 30 && quesize != 0);
    }
Example #19
0
        private static NetworkEventType BaseReceive(NetworkEventType @event, int hostId, ref int connectionId, ref int channelId, byte[] buffer, int bufferSize, ref int receivedSize, ref byte error)
        {
            switch (@event)
            {
            case NetworkEventType.DataEvent:
                MessageType messageType = (MessageType)buffer[receivedSize - 1];
                switch (messageType)
                {
                case MessageType.ConnectToServer:         // Connection approved
                {
                    if (!isClient)
                    {
                        connectionId = (ushort)(buffer[receivedSize - 3] | (buffer[receivedSize - 2] << 8));             // Parse connection id
                    }
                    return(NetworkEventType.ConnectEvent);
                }

                case MessageType.Data:
                {
                    // Implicitly remove header
                    if (isClient)
                    {
                        --receivedSize;
                    }
                    else
                    {
                        connectionId = buffer.FromBytes(receivedSize -= 3);
                    }

                    return(NetworkEventType.DataEvent);
                }

                case MessageType.ClientDisconnect:
                {
                    connectionId = (ushort)(buffer[0] | (buffer[1] << 8));             // Parse connection id
                    return(NetworkEventType.DisconnectEvent);
                }
                }
                break;

            case NetworkEventType.ConnectEvent:
            {
                if (isClient)
                {
                    //Connect via relay
                    string s = new StringBuilder(address).Append(':').Append(port).ToString();
                    buffer[s.Length] = (byte)MessageType.ConnectToServer;

                    // Address data length is implied
                    for (int i = 0; i < s.Length; i++)
                    {
                        buffer[i] = (byte)s[i];         // Get ASCII characters
                    }
                    NetworkTransport.Send(hostId, connectionId, GetReliableChannel(), buffer, s.Length + 1, out error);
                }
                else
                {
                    //Register us as a server
                    buffer[0] = (byte)MessageType.StartServer;
                    NetworkTransport.Send(hostId, connectionId, GetReliableChannel(), buffer, 1, out error);
                }
                return(NetworkEventType.Nothing);        // Connect event is ignored
            }

            case NetworkEventType.DisconnectEvent:
            {
                if ((NetworkError)error == NetworkError.CRCMismatch)
                {
                    Debug.LogError("[MLAPI.Relay] The MLAPI Relay detected a CRC mismatch. This could be due to the maxClients or other connectionConfig settings not being the same");
                }
                return(NetworkEventType.DisconnectEvent);
            }
            }
            return(@event);
        }
Example #20
0
    private void Update()
    {
        if (!isStarted)
        {
            return;
        }

        int recHostId;
        int connectionId;
        int channelId;

        byte[]           recBuffer  = new byte[1024];
        int              bufferSize = 1024;
        int              dataSize;
        byte             error;
        NetworkEventType recData = NetworkTransport.Receive(out recHostId, out connectionId, out channelId, recBuffer, bufferSize, out dataSize, out error);

        switch (recData)
        {
        case NetworkEventType.ConnectEvent:     //2
            Debug.Log("Player " + connectionId + " has connected");
            OnConnection(connectionId);
            break;

        case NetworkEventType.DataEvent:     //3
            string msg = Encoding.Unicode.GetString(recBuffer, 0, dataSize);
            Debug.Log("Receiving from " + connectionId + " : " + msg);
            string[] splitData = msg.Split('|');

            switch (splitData[0])
            {
            case "NAMEIS":
                OnNameIs(connectionId, splitData[1]);
                break;

            case "MYPOSITION":
                OnMyPosition(connectionId, float.Parse(splitData[1]), float.Parse(splitData[2]), float.Parse(splitData[3]));
                break;

            case "CHATMSG":
                OnChatMessage(connectionId, splitData[2], splitData[3]);
                break;

            default:
                Debug.Log("Invalid message : " + msg);
                break;
            }

            break;


        case NetworkEventType.DisconnectEvent:     //4
            Debug.Log("Player " + connectionId + " has disconnected");
            OnDisconnection(connectionId);
            break;
        }

        //ask player for position
        if (Time.time - lastMovementUpdate > movementUpdateRate)
        {
            lastMovementUpdate = Time.time;
            string m = "ASKPOSITION|";
            foreach (ServerClient sc in clients)
            {
                m += sc.connectionId.ToString() + '%' + sc.position.x.ToString() + '%' + sc.position.y.ToString() + '%' + sc.position.z.ToString() + '|';
            }
            m = m.Trim('|');

            Send(m, unreliableChannel, clients);
        }
    }
Example #21
0
 public void ShutdownNetworkTransport()
 {
     NetworkTransport.Shutdown();
 }
Example #22
0
 public void ShutDown()
 {
     NetworkTransport.Shutdown();
     isStarted = false;
     Debug.Log("network shutdown");
 }
Example #23
0
    void Update()
    {
        int recHostId;
        int connectionId;
        int recChannelId;
        int dataSize;

        bool connListUpdated = false;

        if (backgroundImage && backgroundImage.texture == null)
        {
            backgroundImage.texture = manager ? manager.GetUsersLblTex() : null;
        }

//		if(faceManager == null)
//		{
//			faceManager = FacetrackingManager.Instance;
//		}

        if (gestureManager == null)
        {
            gestureManager = VisualGestureManager.Instance;
        }

        if (speechManager == null)
        {
            speechManager = SpeechManager.Instance;
        }

        try
        {
            byte             error   = 0;
            NetworkEventType recData = NetworkTransport.Receive(out recHostId, out connectionId, out recChannelId, recBuffer, bufferSize, out dataSize, out error);

            switch (recData)
            {
            case NetworkEventType.Nothing:                     //1
                break;

            case NetworkEventType.ConnectEvent:                //2
                if (recHostId == serverHostId && recChannelId == serverChannelId &&
                    !dictConnection.ContainsKey(connectionId))
                {
                    HostConnection conn = new HostConnection();
                    conn.hostId       = recHostId;
                    conn.connectionId = connectionId;
                    conn.channelId    = recChannelId;
                    conn.keepAlive    = true;
                    conn.reqDataType  = "ka,kb,km,kh";
                    //conn.matrixSent = false;

                    dictConnection[connectionId] = conn;
                    connListUpdated = true;

                    //Debug.Log(connectionId + "-conn: " + conn.reqDataType);
                }

//				// reset chunked face messages
//				sendFvMsg = string.Empty;
//				sendFvNextOfs = 0;
//
//				sendFtMsg = string.Empty;
//				sendFtNextOfs = 0;
                break;

            case NetworkEventType.DataEvent:                   //3
                if (recHostId == serverHostId && recChannelId == serverChannelId &&
                    dictConnection.ContainsKey(connectionId))
                {
                    HostConnection conn = dictConnection[connectionId];

                    int decompSize = 0;
                    if (decompressor != null && (recBuffer[0] > 127 || recBuffer[0] < 32))
                    {
                        decompSize = decompressor.Decompress(recBuffer, 0, compressBuffer, 0, dataSize);
                    }
                    else
                    {
                        System.Buffer.BlockCopy(recBuffer, 0, compressBuffer, 0, dataSize);
                        decompSize = dataSize;
                    }

                    string sRecvMessage = System.Text.Encoding.UTF8.GetString(compressBuffer, 0, decompSize);

                    if (sRecvMessage.StartsWith("ka"))
                    {
                        if (sRecvMessage == "ka")                         // vr-examples v1.0 keep-alive message
                        {
                            sRecvMessage = "ka,kb,km,kh";
                        }

                        conn.keepAlive               = true;
                        conn.reqDataType             = sRecvMessage;
                        dictConnection[connectionId] = conn;

                        //Debug.Log(connectionId + "-recv: " + conn.reqDataType);

                        // check for SR phrase-reset
                        int iIndexSR = sRecvMessage.IndexOf(",sr");
                        if (iIndexSR >= 0 && speechManager)
                        {
                            speechManager.ClearPhraseRecognized();
                            //Debug.Log("phrase cleared");
                        }
                    }
                }
                break;

            case NetworkEventType.DisconnectEvent:             //4
                if (dictConnection.ContainsKey(connectionId))
                {
                    dictConnection.Remove(connectionId);
                    connListUpdated = true;
                }
                break;
            }

            if (connListUpdated)
            {
                // get all connection IDs
                alConnectionId.Clear();
                alConnectionId.AddRange(dictConnection.Keys);

                // display the number of connections
                StringBuilder sbConnStatus = new StringBuilder();
                sbConnStatus.AppendFormat("Server running: {0} connection(s)", dictConnection.Count);

                foreach (int connId in dictConnection.Keys)
                {
                    HostConnection conn = dictConnection[connId];
                    int            iPort = 0; string sAddress = string.Empty; NetworkID network; NodeID destNode;

                    NetworkTransport.GetConnectionInfo(conn.hostId, conn.connectionId, out sAddress, out iPort, out network, out destNode, out error);
                    if (error == (int)NetworkError.Ok)
                    {
                        sbConnStatus.AppendLine().Append("    ").Append(sAddress).Append(":").Append(iPort);
                    }
                }

                Debug.Log(sbConnStatus);

                if (connStatusText)
                {
                    connStatusText.text = sbConnStatus.ToString();
                }
            }

            // send body frame to available connections
            const char delimiter  = ',';
            string     sBodyFrame = manager ? manager.GetBodyFrameData(ref liRelTime, ref fCurrentTime, delimiter) : string.Empty;

            if (sBodyFrame.Length > 0 && dictConnection.Count > 0)
            {
                StringBuilder sbSendMessage = new StringBuilder();

                sbSendMessage.Append(manager.GetWorldMatrixData(delimiter)).Append('|');
                sbSendMessage.Append(sBodyFrame).Append('|');
                sbSendMessage.Append(manager.GetBodyHandData(ref liRelTime, delimiter)).Append('|');

                if (gestureManager && gestureManager.IsVisualGestureInitialized())
                {
                    sbSendMessage.Append(gestureManager.GetGestureDataAsCsv(delimiter)).Append('|');
                }

                if (speechManager && speechManager.IsSapiInitialized())
                {
                    sbSendMessage.Append(speechManager.GetSpeechDataAsCsv(delimiter)).Append('|');
                }

                if (sbSendMessage.Length > 0 && sbSendMessage[sbSendMessage.Length - 1] == '|')
                {
                    sbSendMessage.Remove(sbSendMessage.Length - 1, 1);
                }

                byte[] btSendMessage = System.Text.Encoding.UTF8.GetBytes(sbSendMessage.ToString());

                int compSize = 0;
                if (compressor != null && btSendMessage.Length > 100)
                {
                    compSize = compressor.Compress(btSendMessage, 0, btSendMessage.Length, compressBuffer, 0);
                }
                else
                {
                    System.Buffer.BlockCopy(btSendMessage, 0, compressBuffer, 0, btSendMessage.Length);
                    compSize = btSendMessage.Length;
                }

//				// check face-tracking requests
//				bool bFaceParams = false, bFaceVertices = false, bFaceUvs = false, bFaceTriangles = false;
//				if(faceManager && faceManager.IsFaceTrackingInitialized())
//					CheckFacetrackRequests(out bFaceParams, out bFaceVertices, out bFaceUvs, out bFaceTriangles);
//
//				byte[] btFaceParams = null;
//				if(bFaceParams)
//				{
//					string sFaceParams = faceManager.GetFaceParamsAsCsv();
//					if(!string.IsNullOrEmpty(sFaceParams))
//						btFaceParams = System.Text.Encoding.UTF8.GetBytes(sFaceParams);
//				}
//
//				// next chunk of data for face vertices
//				byte[] btFaceVertices = null;
//				string sFvMsgHead = string.Empty;
//				GetNextFaceVertsChunk(bFaceVertices, bFaceUvs, ref btFaceVertices, out sFvMsgHead);
//
//				// next chunk of data for face triangles
//				byte[] btFaceTriangles = null;
//				string sFtMsgHead = string.Empty;
//				GetNextFaceTrisChunk(bFaceTriangles, ref btFaceTriangles, out sFtMsgHead);

                foreach (int connId in alConnectionId)
                {
                    HostConnection conn = dictConnection[connId];

                    if (conn.keepAlive)
                    {
                        conn.keepAlive         = false;
                        dictConnection[connId] = conn;

                        if (conn.reqDataType != null && conn.reqDataType.Contains("kb,"))
                        {
                            //Debug.Log(conn.connectionId + "-sendkb: " + conn.reqDataType);

                            error = 0;
                            //if(!NetworkTransport.Send(conn.hostId, conn.connectionId, conn.channelId, btSendMessage, btSendMessage.Length, out error))
                            if (!NetworkTransport.Send(conn.hostId, conn.connectionId, conn.channelId, compressBuffer, compSize, out error))
                            {
                                string sMessage = "Error sending body data via conn " + conn.connectionId + ": " + (NetworkError)error;
                                Debug.LogError(sMessage);

                                if (serverStatusText)
                                {
                                    serverStatusText.text = sMessage;
                                }
                            }
                        }

//						if(bFaceParams && btFaceParams != null &&
//							conn.reqDataType != null && conn.reqDataType.Contains("fp,"))
//						{
//							//Debug.Log(conn.connectionId + "-sendfp: " + conn.reqDataType);
//
//							error = 0;
//							if(!NetworkTransport.Send(conn.hostId, conn.connectionId, conn.channelId, btFaceParams, btFaceParams.Length, out error))
//							{
//								string sMessage = "Error sending face params via conn " + conn.connectionId + ": " + (NetworkError)error;
//								Debug.LogError(sMessage);
//
//								if(serverStatusText)
//								{
//									serverStatusText.text = sMessage;
//								}
//							}
//						}
//
//						if(bFaceVertices && btFaceVertices != null &&
//							conn.reqDataType != null && conn.reqDataType.Contains("fv,"))
//						{
//							//Debug.Log(conn.connectionId + "-sendfv: " + conn.reqDataType + " - " + sFvMsgHead);
//
//							error = 0;
//							if(!NetworkTransport.Send(conn.hostId, conn.connectionId, conn.channelId, btFaceVertices, btFaceVertices.Length, out error))
//							{
//								string sMessage = "Error sending face verts via conn " + conn.connectionId + ": " + (NetworkError)error;
//								Debug.LogError(sMessage);
//
//								if(serverStatusText)
//								{
//									serverStatusText.text = sMessage;
//								}
//							}
//						}
//
//						if(bFaceTriangles && btFaceTriangles != null &&
//							conn.reqDataType != null && conn.reqDataType.Contains("ft,"))
//						{
//							//Debug.Log(conn.connectionId + "-sendft: " + conn.reqDataType + " - " + sFtMsgHead);
//
//							error = 0;
//							if(!NetworkTransport.Send(conn.hostId, conn.connectionId, conn.channelId, btFaceTriangles, btFaceTriangles.Length, out error))
//							{
//								string sMessage = "Error sending face tris via conn " + conn.connectionId + ": " + (NetworkError)error;
//								Debug.LogError(sMessage);
//
//								if(serverStatusText)
//								{
//									serverStatusText.text = sMessage;
//								}
//							}
//						}
                    }
                }
            }
        }
        catch (System.Exception ex)
        {
            Debug.LogError(ex.Message + "\n" + ex.StackTrace);

            if (serverStatusText)
            {
                serverStatusText.text = ex.Message;
            }
        }
    }
Example #24
0
 public override bool ClientSend(int channelId, byte[] data)
 {
     return(NetworkTransport.Send(clientId, clientConnectionId, channelId, data, data.Length, out error));
 }
Example #25
0
    public static void SendSocketMessage(int socketID, int connectionId, int channel, byte[] buffer)
    {
        byte error;

        NetworkTransport.Send(socketID, connectionId, channel, buffer, buffer.Length, out error);
    }
Example #26
0
 public string ClientGetAddress()
 {
     NetworkTransport.GetConnectionInfo(serverHostId, clientId, out string address, out int port, out NetworkID networkId, out NodeID node, out error);
     return(address);
 }
Example #27
0
    protected void init(int port, int maxConnections)
    {
        var topology = getTopology(maxConnections);

        _hostId = NetworkTransport.AddHost(topology, port);
    }
Example #28
0
 public override bool ServerSend(int connectionId, int channelId, byte[] data)
 {
     return(NetworkTransport.Send(serverHostId, connectionId, channelId, data, data.Length, out error));
 }
Example #29
0
        private IEnumerator Receiver()
        {
            int  recSocketId, recConnectionId, recChannelId, recDataSize;
            byte error = 0;

            byte[] recBuffer = new byte[_bufferSize];

            while (true)
            {
                NetworkEventType netEventType = NetworkTransport.Receive
                                                (
                    out recSocketId,
                    out recConnectionId,
                    out recChannelId,
                    recBuffer,
                    _bufferSize,
                    out recDataSize,
                    out error
                                                );

                if (error != 0)
                {
                    Debug.Log($"Error ID -> {error}");
                }
                else
                {
                    switch (netEventType)
                    {
                    case NetworkEventType.Nothing:
                    {
                        yield return(null);

                        break;
                    }

                    case NetworkEventType.DataEvent:
                    {
                        OnDataReceived(recConnectionId, recChannelId, recBuffer, recDataSize);
                        break;
                    }

                    case NetworkEventType.ConnectEvent:
                    {
                        OnConnectedToServer(recConnectionId);
                        break;
                    }

                    case NetworkEventType.DisconnectEvent:
                    {
                        OnDisconnected(recSocketId, recConnectionId);
                        break;
                    }

                    default:
                    {
                        Debug.LogWarning($"Receiver -> Unrecognized Message Type [{netEventType.ToString()}]");
                        break;
                    }
                    }
                    if (error != 0)
                    {
                        Debug.Log($"Error ID -> {error}");
                    }
                }
            }
        }
Example #30
0
    void FixedUpdate()
    {
        while (true)
        {
            int  host;
            int  connection;
            int  channel;
            int  dataSize;
            byte error;

            NetworkEventType eventType = NetworkTransport.Receive(out host, out connection, out channel, buffer, BUFFER_SIZE, out dataSize, out error);

            if (error != 0)
            {
                Debug.Log((NetworkError)error);
            }

            if (eventType == NetworkEventType.Nothing)
            {
                break;
            }

            switch (eventType)
            {
            case NetworkEventType.ConnectEvent:
                Debug.Log("NEW CLIENT CONNECTED!");
                clients.Add(new Client(connection));
                break;

            case NetworkEventType.DataEvent:
                //Debug.Log ("Data recieved: " + buffer [0]);
                //For a standing phone -beta, -gamma, alpha
                alpha = ((buffer [0] << 8) | buffer [1]) / 10f;
                beta  = ((buffer [2] << 8) | buffer [3]) / 10f;
                gamma = ((buffer [4] << 8) | buffer [5]) / 10f;

                if (beta > 180)
                {
                    beta -= 360;
                }
                if (gamma > 180)
                {
                    gamma -= 360;
                }


                bool shouldCalibrate = buffer [6] == 1;
                bool swipeLeft       = buffer [7] == 1;
                bool swipeRight      = buffer [7] == 2;
                bool swipeUp         = buffer [7] == 3;

                //Debug.Log (alpha + ", " + beta + ", " + gamma + ", shouldCalibrate=" + shouldCalibrate);

                Client c = getClient(connection);

                if (shouldCalibrate)
                {
                    c.calibrate(alpha, beta, gamma);
                    Debug.Log("Calibrating.");
                }

                if (swipeLeft)
                {
                    Debug.Log("left is detected");

                    materialIndex--;
                    if (materialIndex < 0)
                    {
                        materialIndex = materials.Length - 1;
                    }
                }

                if (swipeRight)
                {
                    Debug.Log("RIGHT is detected");
                    materialIndex++;
                    if (materialIndex >= materials.Length)
                    {
                        materialIndex = 0;
                    }
                }

                if (swipeUp)
                {
                    Debug.Log("UP is detected");
                    anim.SetInteger(intHash, 1);
                }

                for (int i = 0; i < leatherRenderers.Length; i++)
                {
                    leatherRenderers [i].material = materials [materialIndex];
                }

                AnimatorStateInfo stateInfo = anim.GetCurrentAnimatorStateInfo(0);
                if (stateInfo.nameHash == removeHash)
                {
                    target = c.correct(alpha, beta, gamma);
                }
                break;

            case NetworkEventType.DisconnectEvent:
                Debug.Log("Client disconnected");
                clients.Remove(getClient(connection));
                break;
            }
        }


        if (!Input.GetKey(KeyCode.Space))
        {
            float angle = Quaternion.Angle(currentRotation, target);

            float sensitivity = 0.01f;
            float v           = angle * sensitivity;
            currentRotation = Quaternion.Slerp(currentRotation, target, 0.5f * v / (v + 1.0f));
        }
        else
        {
            currentRotation = target;
        }

        if (Input.GetKey(KeyCode.K))
        {
            Debug.Log("Kicking " + clients.Count + " connected clients.");
            for (int i = 0; i < clients.Count; i++)
            {
                byte error;
                NetworkTransport.Disconnect(hostID, clients[i].getConnectionID(), out error);
            }
            clients.Clear();
        }

        if (clients.Count == 0)
        {
            anim.SetInteger(intHash, 0);
            target = buildQuaternion(90, 0, 0);
        }

        gameObject.transform.SetPositionAndRotation(new Vector3(0, 0, 0), currentRotation);
    }