IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Plateformes (Java EE, Jakarta EE, Spring) et Serveurs Discussion :

Proxy Server redirection


Sujet :

Plateformes (Java EE, Jakarta EE, Spring) et Serveurs

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du 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
    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 Expert Avatar de yildiz-online
    Homme Profil pro
    Architecte de domaine
    Inscrit en
    Octobre 2011
    Messages
    1 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de domaine

    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 447
    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.

  3. #3
    Nouveau membre du 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
    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 Expert Avatar de yildiz-online
    Homme Profil pro
    Architecte de domaine
    Inscrit en
    Octobre 2011
    Messages
    1 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de domaine

    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 447
    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)

  5. #5
    Nouveau membre du 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
    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 Expert Avatar de yildiz-online
    Homme Profil pro
    Architecte de domaine
    Inscrit en
    Octobre 2011
    Messages
    1 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de domaine

    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 447
    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

+ 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, 20h58
  2. Reverse proxy et redirection des sous-domaines
    Par sfair dans le forum Apache
    Réponses: 7
    Dernier message: 02/01/2012, 15h09
  3. ProtocolException: Server redirected too many times
    Par Ceubex dans le forum Général Java
    Réponses: 1
    Dernier message: 28/07/2011, 08h01
  4. Réponses: 0
    Dernier message: 31/12/2008, 12h45

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