Esempio n. 1
0
    private void ClientDisconnectHandler(NetworkClient senderClient)
    {
      this.m_connectedClients.Remove(senderClient);
      Debug.Log("Current connected clients Count={0}.", this.m_connectedClients.Count);

      ContactUpdate removeUpdate = new ContactUpdate();
      removeUpdate.Remove.Add(senderClient.ClientId);

      foreach (NetworkClient connectedClient in this.m_connectedClients) {
        Debug.Log("Sending UpdateContact to remove Client from ClientId={0}.", connectedClient.ClientId);
        connectedClient.SendMessage(MessageType.ContactUpdate, removeUpdate);
      }
    }
Esempio n. 2
0
    private void ServerMessageReceived(NetworkClient senderClient, int messageType, ByteString messageContent)
    {
      Debug.Log("Server message Type={0} Size={1}.", messageType, messageContent.Length);

      switch (messageType) {
        /* Handshake request. */
        case MessageType.ClientHandshakeRequest: {
            HandshakeRequest request = HandshakeRequest.Parser.ParseFrom(messageContent);
            senderClient.UpdatePublicKey(request.Key);

            PublicKey serverPublic = this.ServerKey;
            if (serverPublic == null) {
              Debug.Error("Server public key is invalid.");
              return;
            }

            HandshakeResponse response = new HandshakeResponse();
            response.Key = serverPublic;
            senderClient.SendMessage(MessageType.ClientHandshakeResponse, response);
          }
          break;

        /* Authorization request. */
        case MessageType.AuthorizationRequest: {
            AuthorizationRequest request = AuthorizationRequest.Parser.ParseFrom(messageContent);
            senderClient.Profile.UpdateProfile(request);

            AuthorizationResponse response = new AuthorizationResponse();
            response.ServerName = this.m_serverConfig.ServerName;
            senderClient.SendMessage(MessageType.AuthorizationResponse, response);

            Task.Run(() => {
              ContactUpdate contactUpdate = new ContactUpdate();
              contactUpdate.Add.Add(senderClient.ContactClient);

              foreach (NetworkClient connectedClient in this.m_connectedClients) {
                if (connectedClient.ClientId == senderClient.ClientId) continue;

                Debug.Log("Sending contact update to ClientId={0}.", connectedClient.ClientId);
                connectedClient.SendMessage(MessageType.ContactUpdate, contactUpdate);
              }
            });
          }
          break;

        /* Contact list update. */
        case MessageType.ContactUpdateRequest: {
            ContactUpdateRequest request = ContactUpdateRequest.Parser.ParseFrom(messageContent);
            ContactUpdate contactUpdate = new ContactUpdate();

            List<long> clientList = request.Clients.ToList();
            foreach (NetworkClient connectedClient in this.m_connectedClients) {
              // if (connectedClient.ClientId == senderClient.ClientId) continue;
              if (!connectedClient.Profile.Valid) continue;

              if (clientList.Contains(connectedClient.ClientId)) {
                Debug.Log("Client {0} has got ClientId={1}.", senderClient.ClientId, connectedClient.ClientId);
                clientList.Remove(connectedClient.ClientId);
              }
              else {
                Debug.Log("Client {0} requires ClientId={1}.", senderClient.ClientId, connectedClient.ClientId);
                contactUpdate.Add.Add(connectedClient.ContactClient);
              }
            }

            Debug.Log("Trash clients count={0}.", clientList.Count);
            if (clientList.Count > 0) {
              contactUpdate.Remove.Add(clientList);
            }
            senderClient.SendMessage(MessageType.ContactUpdate, contactUpdate);
          }
          break;

        case MessageType.ContactUpdateChangeRequest: {
            ContactUpdateChangeRequest clientRequestedChange = ContactUpdateChangeRequest.Parser.ParseFrom(messageContent);
            var senderProfile = senderClient.Profile;

            if (senderProfile.Name != clientRequestedChange.Name || senderProfile.Surname != clientRequestedChange.Surname) {
              Debug.Log("Updating client data. This is not implemented on the client side. ;)");
            }
            else if(senderProfile.Status != clientRequestedChange.Online) {
              senderProfile.Status = clientRequestedChange.Online;

              ContactUpdateStatus statusUpdate = new ContactUpdateStatus();
              statusUpdate.Online = clientRequestedChange.Online;
              statusUpdate.ClientId = senderClient.ClientId;

              foreach (NetworkClient connectedClient in this.m_connectedClients) {
                // if (connectedClient.ClientId == senderClient.ClientId) continue;

                Debug.Log("Sending status update to ClientId={0}.", connectedClient.ClientId);
                connectedClient.SendMessage(MessageType.ContactUpdateStatus, statusUpdate);
              }
            }
          }
          break;

        /* Client Public Key request. */
        case MessageType.MessageClientPublicRequest: {
            MessageRequestClientPublic requestMessage = MessageRequestClientPublic.Parser.ParseFrom(messageContent);
            PublicKey responseKey = null;

            foreach (NetworkClient connectedClient in this.m_connectedClients) {
              if (connectedClient.ClientId == requestMessage.ClientId) {
                responseKey = connectedClient.ClientPublic;
              }
            }

            if (responseKey != null) {
              MessageResponseClientPublic responseMessage = new MessageResponseClientPublic();
              responseMessage.ClientId = requestMessage.ClientId;
              responseMessage.Key = responseKey;

              senderClient.SendMessage(MessageType.MessageClientPublicResponse, responseMessage);
            }
            else 
              Debug.Warn("ClientId={0} has invalid public key.");
          }
          break;
      }
    }
Esempio n. 3
0
    private void ClientMessageReceived(NetworkClient senderClient, NetworkPacket receivedPacket)
    {
      NetworkClient requestedUser = this.GetClientFromId(receivedPacket.ClientId);
      if (requestedUser == null) {
        Debug.Warn("Invalid ClientId={0} requested from ClientId={1}.", receivedPacket.ClientId, senderClient.ClientId);
        return;
      }

      Debug.Log("Forwarding message from ClientId={0} to ClientId={1}.", senderClient.ClientId, receivedPacket.ClientId);
      requestedUser.ForwardNetworkPacket(senderClient.ClientId, receivedPacket);
    }
Esempio n. 4
0
    private void ServerListener()
    {
      while (this.m_serverListener != null) {
        TcpClient tcpClient = this.m_serverListener.AcceptTcpClient();
        Debug.Log("New client connection.");

        NetworkClient networkClient = new NetworkClient(tcpClient, this.ClientKeyRequester);
        networkClient.onServerMessageRequest += this.ServerMessageReceived;
        networkClient.onClientMessageRequest += this.ClientMessageReceived;
        networkClient.onClientDisconnected += this.ClientDisconnectHandler;

        this.m_connectedClients.Add(networkClient);
        networkClient.Start();
      }
    }