Вот мой скрипт:
[`
import java .io.;
импортировать java.net.;
Код: Выделить всё
public class VirtualPlayer {
private Socket socket;
private DataInputStream in;
private DataOutputStream out;
public VirtualPlayer(String address, int port) throws IOException {
System.out.println("Attempting to connect to " + address + " on port " + port);
socket = new Socket(address, port);
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
// Send handshake packet
sendHandshake(address, port);
// Send login packet
sendLogin();
// Wait for login response before sending chat message
waitForLogin();
// Send chat message
sendChatMessage("Hello from VirtualPlayer!");
// Log connection status
System.out.println("Connected successfully!");
}
private void sendHandshake(String host, int port) throws IOException {
System.out.println("Sending handshake...");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream packet = new DataOutputStream(baos);
writeVarInt(packet, 0x00); // Packet ID for Handshake
writeVarInt(packet, 340); // Protocol version for Minecraft 1.12.2
packet.writeUTF(host); // Server address
packet.writeShort(port); // Server port
packet.writeByte(1); // Next state: login
sendPacket(baos.toByteArray());
System.out.println("Handshake sent.");
}
private void sendLogin() throws IOException {
System.out.println("Sending login...");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream packet = new DataOutputStream(baos);
packet.writeByte(0x00); // Login Start packet ID
packet.writeUTF("VirtualPlayer"); // Username
sendPacket(baos.toByteArray());
System.out.println("Login packet sent.");
}
private void waitForLogin() throws IOException {
System.out.println("Waiting for login response...");
while (true) {
if (in.available() > 0) {
int packetId = in.readByte(); // Read the packet ID
System.out.println("Received packet ID: " + packetId);
switch (packetId) {
case 0x02: // Replace with actual login success packet ID
System.out.println("Login successful.");
return; // Exit loop on successful login
case 0x01: // Replace with actual login failure packet ID
System.out.println("Login failed.");
return; // Exit loop on failed login
default:
readPacket();
System.out.println("Received unexpected packet ID: " + packetId);
}
} else {
try {
Thread.sleep(100); // Avoid busy-waiting
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
private void sendChatMessage(String message) throws IOException {
System.out.println("Sending chat message...");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream packet = new DataOutputStream(baos);
writeVarInt(packet, 0x01); // Packet ID for Chat Message
packet.writeUTF(message); // Chat message content
sendPacket(baos.toByteArray());
System.out.println("Chat message sent.");
}
private void sendPacket(byte[] packet) throws IOException {
System.out.println("Sending packet: " + java.util.Arrays.toString(packet));
out.write(packet);
out.flush();
}
private void readPacket() throws IOException {
if (in.available() > 0) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[in.available()];
in.readFully(buffer);
baos.write(buffer);
System.out.println("Received packet: " + java.util.Arrays.toString(baos.toByteArray()));
}
}
private void writeVarInt(DataOutputStream out, int value) throws IOException {
while ((value & 0x80) != 0) {
out.writeByte((value & 0x7F) | 0x80);
value >>>= 7;
}
out.writeByte(value);
}
public void close() throws IOException {
System.out.println("Closing connection...");
socket.close();
in.close();
out.close();
}
public static void main(String[] args) {
try {
VirtualPlayer player = new VirtualPlayer("127.0.0.1", 53861);
// Wait to observe behavior
Thread.sleep(5000); // Wait for 5 seconds
player.close();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
`]
Постановка задачи:
Скрипт работает только при работающем локальном сервере. Когда сервер выключен, он выдает ошибки, которые ожидаются, если сервер не работает.
При подключении к серверу локальной сети нет обратной связи от сервера Minecraft, указывающей на то, что сообщения рукопожатия, входа в систему или сообщения чата были обработаны правильно. .
В чем мне нужна помощь:
Понимание того, почему нет подтверждения с сервера Minecraft относительно рукопожатия, входа в систему или сообщений чата.
Проверка работоспособности скрипта правильно обрабатывает пакеты и взаимодействует с сервером.
Руководство по устранению проблем с сетью и проверке правильности функционирования клиента.
Я изучил видео и документацию на YouTube, но нашел их либо слишком сложными, либо неподробными. достаточно для моего нынешнего уровня понимания. Буду очень признателен за любые советы о том, как решить эти проблемы, или за ресурсы, которые помогут мне в этом процессе.
Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/790 ... s-but-also
Мобильная версия