JDBC MySQL

Версия Minecraft
1.12.2
Всем привет!
Впервые работаю с JDBC, поэтому делал все по этому уроку.
Но, при попытке подключиться к серверу меня дисконнектит
[09:41:39] [Netty Client IO #1/INFO] [FML]: [Netty Client IO #1] Client side modded connection established
[09:41:40] [Netty Client IO #1/ERROR] [FML]: NetworkDispatcher exception
java.io.IOException: Программа на вашем хост-компьютере разорвала установленное подключение
at sun.nio.ch.SocketDispatcher.write0(Native Method) ~[?:1.8.0_161]
at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:51) ~[?:1.8.0_161]
at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93) ~[?:1.8.0_161]
at sun.nio.ch.IOUtil.write(IOUtil.java:51) ~[?:1.8.0_161]
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471) ~[?:1.8.0_161]
at io.netty.channel.socket.nio.NioSocketChannel.doWrite(NioSocketChannel.java:417) ~[NioSocketChannel.class:4.1.9.Final]
at io.netty.channel.AbstractChannel$AbstractUnsafe.flush0(AbstractChannel.java:856) ~[AbstractChannel$AbstractUnsafe.class:4.1.9.Final]
at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.flush0(AbstractNioChannel.java:362) ~[AbstractNioChannel$AbstractNioUnsafe.class:4.1.9.Final]
at io.netty.channel.AbstractChannel$AbstractUnsafe.flush(AbstractChannel.java:823) ~[AbstractChannel$AbstractUnsafe.class:4.1.9.Final]
at io.netty.channel.DefaultChannelPipeline$HeadContext.flush(DefaultChannelPipeline.java:1296) ~[DefaultChannelPipeline$HeadContext.class:4.1.9.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776) ~[AbstractChannelHandlerContext.class:4.1.9.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768) ~[AbstractChannelHandlerContext.class:4.1.9.Final]
at io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749) ~[AbstractChannelHandlerContext.class:4.1.9.Final]
at io.netty.channel.ChannelDuplexHandler.flush(ChannelDuplexHandler.java:117) ~[ChannelDuplexHandler.class:4.1.9.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776) ~[AbstractChannelHandlerContext.class:4.1.9.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768) ~[AbstractChannelHandlerContext.class:4.1.9.Final]
at io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749) ~[AbstractChannelHandlerContext.class:4.1.9.Final]
at io.netty.channel.ChannelOutboundHandlerAdapter.flush(ChannelOutboundHandlerAdapter.java:115) ~[ChannelOutboundHandlerAdapter.class:4.1.9.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776) ~[AbstractChannelHandlerContext.class:4.1.9.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768) ~[AbstractChannelHandlerContext.class:4.1.9.Final]
at io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749) ~[AbstractChannelHandlerContext.class:4.1.9.Final]
at io.netty.channel.ChannelOutboundHandlerAdapter.flush(ChannelOutboundHandlerAdapter.java:115) ~[ChannelOutboundHandlerAdapter.class:4.1.9.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776) ~[AbstractChannelHandlerContext.class:4.1.9.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768) ~[AbstractChannelHandlerContext.class:4.1.9.Final]
at io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749) ~[AbstractChannelHandlerContext.class:4.1.9.Final]
at io.netty.channel.ChannelOutboundHandlerAdapter.flush(ChannelOutboundHandlerAdapter.java:115) ~[ChannelOutboundHandlerAdapter.class:4.1.9.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776) ~[AbstractChannelHandlerContext.class:4.1.9.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768) ~[AbstractChannelHandlerContext.class:4.1.9.Final]
at io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749) ~[AbstractChannelHandlerContext.class:4.1.9.Final]
at net.minecraftforge.fml.common.network.handshake.NetworkDispatcher.flush(NetworkDispatcher.java:559) ~[NetworkDispatcher.class:?]
at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776) ~[AbstractChannelHandlerContext.class:4.1.9.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeWriteAndFlush(AbstractChannelHandlerContext.java:802) ~[AbstractChannelHandlerContext.class:4.1.9.Final]
at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:814) ~[AbstractChannelHandlerContext.class:4.1.9.Final]
at io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:794) ~[AbstractChannelHandlerContext.class:4.1.9.Final]
at io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:831) ~[AbstractChannelHandlerContext.class:4.1.9.Final]
at io.netty.channel.DefaultChannelPipeline.writeAndFlush(DefaultChannelPipeline.java:1032) ~[DefaultChannelPipeline.class:4.1.9.Final]
at io.netty.channel.AbstractChannel.writeAndFlush(AbstractChannel.java:296) ~[AbstractChannel.class:4.1.9.Final]
at net.minecraft.network.NetworkManager$4.run(NetworkManager.java:261) [NetworkManager$4.class:?]
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) [AbstractEventExecutor.class:4.1.9.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:403) [SingleThreadEventExecutor.class:4.1.9.Final]
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:442) [NioEventLoop.class:4.1.9.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858) [SingleThreadEventExecutor$5.class:4.1.9.Final]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_161]
[09:41:41] [main/INFO] [FML]: Applying holder lookups
[09:41:41] [main/INFO] [FML]: Holder lookups applied

package ru.fact.r2;

import java.sql.*;

public class SqlHelper {
private static final String user = "minecraft11";
private static final String password = "123";
private static final String url = "jdbc:mysql://1.1.1.1:3306/minecraft";

public static Connection connection;
public static Statement statement;
public static ResultSet resSet;

public static SqlHelper sqlHelperInstance = new SqlHelper(); //Создадим instance нашего класса для быстрого доступа

public void setConnection() throws SQLException {
try {
Class.forName("com.mysql.jdbc.Driver"); //Настраиваем драйвер JDBC
System.out.println("Driver was loaded");
} catch (ClassNotFoundException e) {
System.out.println("Class not Found!!!");
}

try {
connection = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
System.err.println("Connection can't be estabilished!!!"); //В случае если не сможет подключиться
}

if (connection != null) {
System.out.println("Connection with database was created!!!"); //Если все-таки соединение установлено, выведется это сообщение
} else System.out.println("There's fail to create connection!");
}

public void registerPlayer(String name) throws SQLException { //Функция регистрация игрока в базе данных на основе запроса БД
statement.executeUpdate("INSERT INTO players (name, money) VALUES ('" + name + "', '0',)");
System.out.println("Register player");
}

public boolean playerRegistered(String name) throws SQLException { //Возвращает true, если игрок уже зарегистрирован в системе
statement = connection.createStatement();
resSet = statement.executeQuery("SELECT EXISTS(SELECT * FROM players WHERE name='" + name + "')");
resSet.next();
if (resSet.getInt(1) == 1) {
System.out.println("Player registered");
return true;
} else {
System.out.println("PLayer not registered");
return false;
}

}
}

package ru.fact.r2;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.text.TextComponentString;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.PlayerEvent;

import java.sql.*;

public class EventsHandler {
@SubscribeEvent
public void onPlayerLogsIn(PlayerEvent.PlayerLoggedInEvent event) throws SQLException {
EntityPlayer player = event.player;

if (!player.world.isRemote) {
if (!SqlHelper.sqlHelperInstance.playerRegistered(player.getDisplayNameString())) {
SqlHelper.sqlHelperInstance.registerPlayer(player.getDisplayNameString());

}
}
}
}

Подключение к БД разрешено, тестил через telnet.
Спасибо заранее.
 
Последнее редактирование:
1,038
57
229
Можно воспользоваться моими наработками с github ZZZubec/PluginUtils
Суть их в том что там есть общий класс для работы с SQL (SQLLite и MySQL), плюс есть поддержка конфиг файлов, которые умеют быть как древовидные (YAMP), так и типичные в одну строчку. Удобное чтение, запись, сортировка

А использовать можно так:

Java:
import ru.salamandr.dev.utils.*;

// лог файл, он нужен почти всем компонентам
logSystem = new LogSystem( "landZwood", filename );
logSystem.debug = 3;
logSystem.writeOut = false;

// подключение к sqllite, к MySQL тоже самое, только используешь "localhost:3306"
db_config = new DataBaseConfig( GameNetwork.getGamePath() + "/config/users.db" );
sql = new SQLSystem( logSystem, db_config, EnumSQL.SQLLite );

// выборка
ResultSet res =  sql.query( "SELECT u.uid as uid, u.login, u.password, uinfo.x, uinfo.y, uinfo.money, uinfo.fuel FROM users u " +
                "LEFT OUTER JOIN user_info uinfo ON uinfo.uid = u.uid " +
                "WHERE u.login='ZZZubec'" );
        String password = GameNetwork.instance.md5("12345678");
        try {
            while (res != null && res.next()) {
                System.out.println( "id:" + res.getInt(1) + ", login:" + res.getString(2)
                        + ", XY:" + res.getFloat(4) + "," + res.getFloat(5) + ", money=" + res.getInt(6) + ", fuel=" + res.getInt(7) );
                if( password.equals( res.getString("password") ) )
                {
                    System.out.println("Password PASS!");
                }
                else
                {
                    System.out.println("Password ERROR!");
                    //packetAnswer.errorID = GameNetwork.AUTH_BAD_PASSWORD;
                    //packetAnswer.packetName = BPP_AuthLogin.class.getSimpleName();
                    //packetAnswer.messageID = 0;
                    //userInfo.client.sendPacket(packetAnswer);
                }
            }
        } catch (SQLException ex ) {
            ex.printStackTrace();
        }

// если необходимо вставить строку или наоборот убрать пишешь через
boolean result = sql.update( "INSERT INTO users (`username`, `password) VALUES('" + name + "', '12345678')");
if(result)
    System.out.println( "update successful");

использовать проще всего SqlLite.
Но если тебе принципиально MySQL, то поставь Workbench с официального сайта (MySQL :: MySQL Workbench) и убедись что он у тебя вообще работает.
Кроме того надо убедиться что у тебя именно тот драйвер подключен (JAR), с ними тоже геморой ещё тот.
 
Последнее редактирование:
1,038
57
229
И вообще у тебя ошибка в NetworkDispatcher (Netty)
IOException - это ошибка ввода/вывода
это ошибка появляется при работе с файловой системой и передачи пакетов по сети (а также stream)
 
Последнее редактирование:
Сверху