SmokingDude
-
Posts
10 -
Joined
-
Last visited
Posts posted by SmokingDude
-
-
On 4/22/2021 at 4:01 PM, diesieben07 said:
For example, yes.
I tried I mean I succeeded and until then there's no more worries the server gets the connection, minecraft no longer stops, but I can not communicate between the client and the server, the client must send a certain string to the server when it performs a specific action no matter how I do it (synchronised irc or synchronised boolean etc the client never sends anything to the server, would you have a lead on what I need to do to get to settle this please)
-
Yes i have a class called '' KeybindListener '' And inside I have this method :
@SubscribeEvent
public void onKeyPress(InputEvent.KeyInputEvent event) { if(Keyboard.isKeyDown(Keyboard.KEY_R))
if(irc==null) {
irc = new IRCClient(''samuele.site'',2406);
irc.run();
}
showgui();
}
I do register this class with MinecraftForge.EVENT_BUS.register(new KeybindListener()) ;
Quote -
5 hours ago, diesieben07 said:
Netty is a library for network communication. Minecraft already uses it for its networking so you can "just use it".
I implémented Netty everything seems working the server actually receive the connection of the client but the game still stop when i connect to the server, how am I supposed to use Netty to get minecraft working ?
The client part source : https://pastebin.com/v5dN94BJ
-
4 hours ago, diesieben07 said:
Using raw threads, raw sockets, ObjectOutputStream and terrible exception handling. All of these are no-gos. You should use Netty.
So netty allow me to communicate between my minecraft and a distant vps right ? There is some way to use it with forge or should i use it like i can use it on normal Java programme ?
-
Hello, I have a project that consists of linking several clients together without the mod being installed on the server, even if the players are on a different server the communication must be possible so I decided to use the Socket after several attempts it works the worry is that after calling the method to accept a connection on the server side, minecraft stops as if the main thread stopped when I close the vps minecraft resumes as if nothing was wrong, I use threads whether in client or server to make the connection and exchange information, is the socket the right way used if yes how could I do not stop the main thread of minecraft here are the client code and the server one
public ServerListener() { debug("Creating the server"); clientList = new ArrayList<ConnectionToClient>(); messages = new LinkedBlockingQueue<Object>(); debug("Client list is created"); try { serverSocket = new ServerSocket(2406); debug("opening the port 2406"); } catch (IOException e) { e.printStackTrace(); debug(e.getMessage()); } debug("creating the accept thread"); Thread accept = new Thread() { public void run() { debug("thread created"); while (true) { try { Socket s = serverSocket.accept(); if(s!=null) { debug("new client joined"); clientList.add(new ConnectionToClient(s)); debug("new client was accepted ["+ s.getInetAddress() + "/" + s.getPort()+"]"); } } catch (IOException e) { e.printStackTrace(); debug(e.getMessage()); } } } }; accept.setDaemon(true); accept.start(); Thread messageHandling = new Thread() { public void run() { while (true) { try { Object message = messages.take(); debug("we parse the ping"); parse(message); System.out.println("Message Received: " + message); } catch (InterruptedException e) { } } } }; messageHandling.setDaemon(true); messageHandling.start(); } private void parse(Object message) { String msg = String.valueOf(message); if(msg.contains("-")) { if(msg.contains("key")) { debug("key detected"); key = msg.split("-")[1]; } else if(msg.contains("name")) { debug("name detected"); name = msg.split("-")[1]; } else if(msg.contains("world")) { debug("worldname detected"); world = msg.split("-")[1]; } else if(msg.contains("server")) { debug("servername detected"); server = msg.split("-")[1]; } else if(msg.contains("x")) { debug("x detected"); x = Integer.parseInt(msg.split("-")[1]); } else if(msg.contains("y")) { debug("y detected"); y = Integer.parseInt(msg.split("-")[1]); } else if(msg.contains("z")) { debug("z detected"); z = Integer.parseInt(msg.split("-")[1]); } else if(msg.contains("isEntity")) { debug("entity detected"); entity = msg.split("-")[1].equalsIgnoreCase("true"); } else if(msg.contains("ticks")) { debug("ticks detected"); lTicks = Integer.parseInt(msg.split("-")[1]); } else if(msg.contains("end")) { debug("we got everything detected"); toSend = new IrcMPING(key, name, world, server, x, y, z, entity, lTicks); for(String str : toSend.getArgs()) { sendToAll(str); } toSend=null; } } } public void sendToOne(int index, Object message) throws IndexOutOfBoundsException { clientList.get(index).write(message); } public void sendToAll(Object message) { for (ConnectionToClient client : clientList) { debug("sending the ping to " + client.socket.getInetAddress()); client.write(message); } } public void debug(String str) { System.out.println("SOROS DEBUG [MULTIPING] : " + str) ; } private class ConnectionToClient { ObjectInputStream in; ObjectOutputStream out; Socket socket; ConnectionToClient(Socket socket) throws IOException { this.socket = socket; in = new ObjectInputStream(socket.getInputStream()); out = new ObjectOutputStream(socket.getOutputStream()); Thread read = new Thread() { public void run() { while (true) { try { Object obj = in.readObject(); messages.put(obj); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } }; read.setDaemon(true); // terminate when main ends read.start(); } public void write(Object obj) { try { out.writeObject(obj); } catch (IOException e) { e.printStackTrace(); } } } }
public IRCClient() throws IOException { socket = new Socket(InetAddress.getByAddress(new byte[]{(byte) 185, (byte) 242, (byte) 180,97}), 2406); messages = new LinkedBlockingQueue<Object>(); server = new ConnectionToServer(socket); Thread messageHandling = new Thread() { public void run() { while (true) { try { Object message = messages.take(); parse(message); System.out.println("Message Received: " + message); } catch (InterruptedException e) { } } } }; messageHandling.setDaemon(true); messageHandling.start(); } private void parse(Object message) { String msg = String.valueOf(message); if (msg.contains("-")) { if (msg.contains("key")) { key = msg.split("-")[1]; } else if (msg.contains("name")) { name = msg.split("-")[1]; } else if (msg.contains("world")) { world = msg.split("-")[1]; } else if (msg.contains("server")) { serverName = msg.split("-")[1]; } else if (msg.contains("x")) { x = Integer.parseInt(msg.split("-")[1]); } else if (msg.contains("y")) { y = Integer.parseInt(msg.split("-")[1]); } else if (msg.contains("z")) { z = Integer.parseInt(msg.split("-")[1]); } else if (msg.contains("isEntity")) { entity = msg.split("-")[1].equalsIgnoreCase("true"); } else if (msg.contains("ticks")) { lTicks = Integer.parseInt(msg.split("-")[1]); } else if (msg.contains("end")) { if (key.equalsIgnoreCase(MultiPingMod.getKey()) && !name.equalsIgnoreCase(Minecraft.getMinecraft().thePlayer.getName())) { MultiPing m = new MultiPing(name, world, serverName, x, y, z, entity); MultiPingMod.setTime(lTicks); m.render = true; if (MultiPingMod.render.getToRender().containsKey(name)) { MultiPingMod.render.getToRender().get(name).render = false; MultiPingMod.render.getToRender().remove(name); } MultiPingMod.render.addToRender(m); } } } } public void send(Object obj) { server.write(obj); } private class ConnectionToServer { ObjectInputStream in; ObjectOutputStream out; Socket socket; ConnectionToServer(Socket socket) throws IOException { this.socket = socket; in = new ObjectInputStream(socket.getInputStream()); out = new ObjectOutputStream(socket.getOutputStream()); Thread read = new Thread() { public void run() { while (true) { try { Object obj = in.readObject(); messages.put(obj); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } }; read.setDaemon(true); read.start(); } private void write(Object obj) { try { out.writeObject(obj); } catch (IOException e) { e.printStackTrace(); } } }
-
Perfect that work thank you really much diesieben07 thank you too Draco18s and championash5357 for tried to help
-
private static final String PROTOCOL_VERSION = "1.0";
public static final SimpleChannel INSTANCE = NetworkRegistry.newSimpleChannel(
new ResourceLocation("cosmod", "main"),
() -> PROTOCOL_VERSION,
PROTOCOL_VERSION::equals,
PROTOCOL_VERSION::equals
);
I actually have this in a class i don't have to specify i register the simpleimpl anywhere ?
-
I added a network channel, but how can i know if the channel exist on the client side ?
-
I'm currently working on a mod for a server and I'd like to make sure that people who connect without the mod is disconnected, but I have no idea how I should do it, the mod will be installed on the server side and will have to be installed on the client side, but how do I know if it is well installed on the client side?
Using Java socket on minecraft
in Modder Support
Posted · Edited by SmokingDude
Yes sorry for my bad english, on the IRCClient class i have a method called '' send '' who basically send a string to the server, this method is called from the KeybindListener when the player hit the '' R '' key, When the server receives a message it is supposed to write ''message received from the client : the message '' But the server does not print anything in the terminal which means that it receives nothing and I think it comes from the fact that IRCClient is declared in a different thread to the thread in which the keyinput event is, and I do not know how to be able to call 'send' from the thread for it to works