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
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
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(); }
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(); } }
Partager