У меня проблема: скрипт, созданный для создания виртуального плеера, работает, но не работает.JAVA

Программисты JAVA общаются здесь
Anonymous
У меня проблема: скрипт, созданный для создания виртуального плеера, работает, но не работает.

Сообщение Anonymous »

У меня возникли проблемы с программой Java, которая пытается подключиться к серверу Minecraft и отправить сообщение в чат. Сценарий обнаруживает ошибки, когда сервер не работает, но работает без проблем, когда мой сервер локальной сети активен. Однако от сервера Minecraft нет подтверждения того, что какие-либо действия были совершены.
Вот моя программа:

Код: Выделить всё

import java.io.*;
import 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();
}
}

}
Скрипт работает только при работающем LAN-сервере. Когда сервер выключен, он выдает ошибки, которые ожидаются, если сервер не работает. При подключении к серверу локальной сети нет обратной связи от сервера Minecraft, указывающей на то, что рукопожатие, вход в систему или сообщения чата были обработаны правильно.
В чем мне нужна помощь:
  • Понимание того, почему нет подтверждения от сервера Minecraft относительно рукопожатия, входа в систему или сообщений чата.
    = Проверка того, правильно ли программа обрабатывает пакеты и взаимодействие с сервер.
  • Руководство по устранению проблем с сетью и проверке правильности функционирования клиента.
I Я исследовал видео и документацию YouTube, но нашел их либо слишком сложными, либо недостаточно подробными для моего текущего уровня понимания. Буду очень признателен за любые советы о том, как решить эти проблемы, или за ресурсы, которые помогут мне в этом процессе.

Подробнее здесь: https://stackoverflow.com/questions/790 ... s-but-also

Вернуться в «JAVA»