1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2016
    Messages : 7
    Points : 2
    Points
    2

    Par défaut Proxy Server redirection

    Bonjour bonjour, j'ai un petit (gros) soucis concernant les sockets.
    J'ai créé un serveur proxy reliant plusieurs serveurs(minecraft) entre eux. J'ai essayé avec les sockets, et avec netty.io
    Pour les deux, j'arrive au même résultat. J'arrive à rediriger sur le serveur et a créé une communication avec le client.
    Le hic viens quand je souhaite transférer un client entre les serveurs. La ça devient beaucoup plus compliqué.

    Il faut savoir qu'avec minecraft, il y a une constante communication entre client serveur. La fluidité du jeu dépends de la vitesse d'envoie et de récéption des données. Et quand la communication s'arrête, le client est déconnecté.
    J'ai quasiment tout essayé pour parvenir à mes fins, mais j'ai pas réussit à faire en sorte d'agir après la déconnection ou avant.

    J'essaye donc de transférer un joueur d'un serveur A à un serveur B.
    La manière importe peu. Que ça soit un transfert direct, ou déconnecter le client pour le reconnecter au proxy pour pouvoir le rediriger sur l'autre serveur, ça me va.

    Y a t'il quelques idées ?

    Je vous poste vite fait l'agencement avec les sockets, celui avec netty étant un peu plus volumineux.

    La classe principale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    public void run(int remoteport, int localport)
    	{
    		proxy.getLogger().log("Démarrage de l'écoute sur le port "+localport);
    		proxy.getLogger().log("Redirection sur le port "+remoteport);
     
    		new Thread(proxy.getThreadManager(), null, "listener")
    		{
    			public void run()
    			{
    				ServerSocket ss = null;
     
    				try
    				{
    					ss = new ServerSocket(25565);
    				}
    				catch (IOException e)
    				{
    					proxy.getLogger().log(LogType.SEVERE, "Failed to bin the port "+localport);
    					proxy.stop();
    					return;
    				}
     
    				while (proxy.isRunning())
    				{
    					try 
    					{
    						ss.setSoTimeout(5000);
    						Socket socket = ss.accept();
     
     
    						socket.setSoTimeout(3000);
    						BufferedInputStream input = new BufferedInputStream(socket.getInputStream());
     
    						byte[] k = new byte[1460];
    						int mark = 0;
    						input.mark(mark);
    						int m = input.read(k, 0, 1460);
    						input.reset();
     
    						if (m > 17)
    						{
    							String playerName = new String(k, 17, m).trim();
    							UUID uuid = getMojangUUID(playerName);
     
    							if (uuid != null)
    							{
    								ProxyPlayer player = new ProxyPlayer(proxy, uuid, playerName);
     
    								new Thread(proxy.getThreadManager(), new pendingConnection(input, player, socket, remoteport)).start();
    							}
    							else {
    								socket.close();
    							}
    						}
    						else {
    							socket.close();
    						}
     
    					} 
    					catch (IOException e) { }
    				}
     
    				try {
    					ss.close();
    				} catch (IOException e) { }
     
    			}
    		}.start();
    	}
    La classe client
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    @Override
    	public void run()
    	{
    		if (client.isClosed()) return;
     
    		try {
    			output = new BufferedOutputStream(client.getOutputStream());
    		} catch (IOException e1) {
    			e1.printStackTrace();
    		}
     
    		try 
    		{     
    			 server = new Socket(InetAddress.getLocalHost(), port);
     
    			 serverInput = new BufferedInputStream(server.getInputStream());
    			 serverOutput = new BufferedOutputStream(server.getOutputStream());
     
    			 Thread t = new Thread()
    			 {
    				 public void run()
    				 {
    					 int bytesRead;
    					 try 
    					 {
    						 while ((bytesRead = input.read(request)) != -1)
    						 {
    							 serverOutput.write(request, 0, bytesRead);
    							 serverOutput.flush();	 
    						 }
    					 }
    					 catch (IOException e) {  }
     
    					 try { serverOutput.close(); } catch (IOException e) { e.printStackTrace(); }
    				 }
    			 };
    			 t.start();
     
    			 try
    			 {
     
    				int bytesRep;
    				while ((bytesRep = serverInput.read(reply)) != -1)
    				{
    					 output.write(reply, 0,bytesRep);
    					 output.flush();
    				}
    				t.interrupt();
    			}
    			catch (IOException e)
    			{
    				PlayerQuitEvent event = new PlayerQuitEvent(player, player.getProxy().getServer(getPort()));
    				player.getProxy().getPluginManager().callEvent(event);
    				System.out.println("deconnection");
    				return;
    			}
    		} 
    		catch (UnknownHostException e) 
    		{
    			e.printStackTrace();
    		} 
    		catch (IOException e) 
    		{
    			e.printStackTrace();
    		}
    	}

  2. #2
    Membre émérite Avatar de yildiz-online
    Homme Profil pro
    Architecte technique
    Inscrit en
    octobre 2011
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : octobre 2011
    Messages : 724
    Points : 2 505
    Points
    2 505

    Par défaut

    Ton client est connecté sur le serveur ou le proxy? si c'est le proxy pas de soucis à couper la session du client entre le proxy et un serveur pour le reconnecter sur un autre, la connexion client-> proxy restera effective.
    Yildiz-Engine an open-source modular game engine: Website
    Yildiz-Online a 3D MMORTS in alpha: Facebook page / Youtube page

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2016
    Messages : 7
    Points : 2
    Points
    2

    Par défaut

    Citation Envoyé par yildiz-online Voir le message
    Ton client est connecté sur le serveur ou le proxy? si c'est le proxy pas de soucis à couper la session du client entre le proxy et un serveur pour le reconnecter sur un autre, la connexion client-> proxy restera effective.
    Il est connecté au proxy. Si je ferme le proxy, ça déconnecte. Le problème c'est comment couper la liaison sans le déco du proxy.

  4. #4
    Membre émérite Avatar de yildiz-online
    Homme Profil pro
    Architecte technique
    Inscrit en
    octobre 2011
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : octobre 2011
    Messages : 724
    Points : 2 505
    Points
    2 505

    Par défaut

    Tu peux pas couper le proxy, c'est ça le principe, par contre tu peux couper la liaison entre le proxy et un serveur pour établir une connexion vers un autre serveur (en ayant un cache des évenements arrivant du client et du serveur pour être à jour une fois la reconnexion effective)
    Yildiz-Engine an open-source modular game engine: Website
    Yildiz-Online a 3D MMORTS in alpha: Facebook page / Youtube page

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2016
    Messages : 7
    Points : 2
    Points
    2

    Par défaut

    j'ai déjà essayé de fermer la socket du serveur. Le joueur reste connecté au serveur visuellement mais le serveur le considère comme déconnecté. Ca coupe les flux de communication.
    Mais j'arrive pas à le transférer sur l'autre serveur.

  6. #6
    Membre émérite Avatar de yildiz-online
    Homme Profil pro
    Architecte technique
    Inscrit en
    octobre 2011
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : octobre 2011
    Messages : 724
    Points : 2 505
    Points
    2 505

    Par défaut

    donc il était connecté au serveur et pas au proxy.

    sans heartbeat c'est normal que le client soit pas notifié

    Pour résumer:

    client -> proxy -> serveur, le client n'a donc jamais une connexion directe vers le serveur, ce sont 2 sockets séparés
    C'est la responsabilité du proxy de garder la connexion, cacher les events, reconnecter et resynchroniser client et serveur
    Yildiz-Engine an open-source modular game engine: Website
    Yildiz-Online a 3D MMORTS in alpha: Facebook page / Youtube page

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2016
    Messages : 7
    Points : 2
    Points
    2

    Par défaut

    Oui,n c'est à peu près comme ça que ça se passe. La socket client est à part.
    Maintenant me reste à savoir comment faire en sorte que le client soit 'libre' comme lors de sa première connection au proxy, pour pouvoir réappeler la méthode de connection avec un autre port.

  8. #8
    Membre émérite Avatar de yildiz-online
    Homme Profil pro
    Architecte technique
    Inscrit en
    octobre 2011
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : octobre 2011
    Messages : 724
    Points : 2 505
    Points
    2 505

    Par défaut

    Je ne pense pas avoir bien compris ce que tu veux faire, pourquoi ce serait au client de se préoccuper du serveur sur lequel il va se connecter, dans ce cas, le proxy ne sert à rien
    Yildiz-Engine an open-source modular game engine: Website
    Yildiz-Online a 3D MMORTS in alpha: Facebook page / Youtube page

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2016
    Messages : 7
    Points : 2
    Points
    2

    Par défaut

    Citation Envoyé par yildiz-online Voir le message
    Je ne pense pas avoir bien compris ce que tu veux faire, pourquoi ce serait au client de se préoccuper du serveur sur lequel il va se connecter, dans ce cas, le proxy ne sert à rien
    Le client ne se préoccupe de rien, j'essaye de rediriger le client avec le proxy, via la socket créé lors de sa première connexion au proxy.
    Il y a deux serveurs lié au proxy. Le client se connecte toujours au proxy d'abord, et est redirigé sur le serveur A lors de sa connexion

    Mais c'est la ou le bât blesse. dès que je veux couper la communication avec le serveur A pour le remplacer par le serveur B, je n'arrive plus à interragir avec le client après.
    Soit il reste gelé sur le serveur A, soit il est déconnecté du serveur A. Dans les deux cas je n'arrive pas à le rediriger sur le B.

    Si tu regardes la classe client à la ligne 15, c'est la ou je créé la socket pour lier le client au serveur A, et après il y a deux boucles while pour l'envoi et la réception de données.

  10. #10
    Membre émérite Avatar de yildiz-online
    Homme Profil pro
    Architecte technique
    Inscrit en
    octobre 2011
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : octobre 2011
    Messages : 724
    Points : 2 505
    Points
    2 505

    Par défaut

    il doit effectivement être déco de A, c'est le proxy qui doit envoyer cette requête, pour ensuite être co sur B, le proxy va absorber les infos d'initialisation et vérifier qu'elles concordent avec l'état du client, si pas, le proxy envoie le delta au client.
    Yildiz-Engine an open-source modular game engine: Website
    Yildiz-Online a 3D MMORTS in alpha: Facebook page / Youtube page

  11. #11
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2016
    Messages : 7
    Points : 2
    Points
    2

    Par défaut

    J'ai pas une très grande expérience avec les sockets.

    - De quelle manière devrais-je déconnecter le client du serveur ? la manière brute, en appelant la méthode close() de la socket du serveur ainsi que les input/output, ne fonctionne pas à première vue. Ou alors elle fonctionne mais n'est pas finalisé avec la deuxième question.

    - Qu'est ce que tu entends pas les infos d'initialisation et la concordance avec le client ? ça c 'est un point que j'ai pas pris en compte.

  12. #12
    Membre émérite Avatar de yildiz-online
    Homme Profil pro
    Architecte technique
    Inscrit en
    octobre 2011
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : octobre 2011
    Messages : 724
    Points : 2 505
    Points
    2 505

    Par défaut

    Tu ne déconnectes pas le client du serveur, le client est connecté au proxy, tu déconnectes le proxy du serveur, le socket client<->proxy restant toujours actif.
    Par contre pour déconnecter le proxy, tu dois envoyer un message de déconnexion au serveur identique à celui du protocole du logiciel.
    Tu peux aussi faire un close mais c'est moche, par contre pas de raison que ça ne marche pas.

    Quand tu te connectes sur un serveur, il va t'envoyer les informations pour initialiser ton client dans l'état courant du serveur, vu que ton client connecté au proxy est déjà initialisé, il n'a pas besoin de toutes ces données, juste du delta entre son état actuel et le serveur (qui peut avoir changé dans l’intervalle de temps de connexion vers le serveur B).
    Yildiz-Engine an open-source modular game engine: Website
    Yildiz-Online a 3D MMORTS in alpha: Facebook page / Youtube page

  13. #13
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2016
    Messages : 7
    Points : 2
    Points
    2

    Par défaut

    Ok je vois. Merci pour ton aide, je vais essayer de voir tout ça avec tes infos.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Proxy Server APACHE et..
    Par ETVigan dans le forum Firefox
    Réponses: 3
    Dernier message: 02/02/2012, 21h58
  2. Reverse proxy et redirection des sous-domaines
    Par sfair dans le forum Apache
    Réponses: 7
    Dernier message: 02/01/2012, 16h09
  3. ProtocolException: Server redirected too many times
    Par Ceubex dans le forum Général Java
    Réponses: 1
    Dernier message: 28/07/2011, 09h01
  4. Réponses: 0
    Dernier message: 31/12/2008, 13h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo