Тут почитал wiki.vg/Protocol
и попробовал составить простенький сервер. Попробовал отправить пакет, содержащий Packet ID, версию протокола, название сервера и его MOTD. Но что-то Minecraft отказывается отображать MOTD, присланный сервером. Что я сделал не так?
Server.java:
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
private static final int PORT = 25565;
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(PORT);
while (true) {
Socket client = ss.accept();
System.out.println("client connected!");
DataOutputStream dos = new DataOutputStream(client.getOutputStream());
byte[] a = PacketManager.createHandshakeMessage();
PacketManager.writeVarInt(dos, a.length);
dos.write(a);
}
} catch (Exception e) {
}
}
}
PacketManager.java:
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
public class PacketManager {
public static byte [] createHandshakeMessage() throws Exception {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
DataOutputStream handshake = new DataOutputStream(buffer);
handshake.writeByte(0x00);
writeVarInt(handshake, 0x07);
writeString(handshake, "FrikaWorld", StandardCharsets.UTF_8);
writeString(handshake, "FrikaWorld", StandardCharsets.UTF_8);
writeVarInt(handshake, 0x64);
return buffer.toByteArray();
}
public static int readVarInt(DataInputStream dis) throws Exception {
int numRead = 0;
int result = 0;
byte read;
do {
read = dis.readByte();
int value = (read & 0b01111111);
result |= (value << (7 * numRead));
numRead++;
if (numRead > 5) {
throw new RuntimeException("VarInt is too big");
}
} while ((read & 0b10000000) != 0);
return result;
}
public static long readVarLong(DataInputStream dos) throws Exception {
int numRead = 0;
long result = 0;
byte read;
do {
read = dos.readByte();
int value = (read & 0b01111111);
result |= (value << (7 * numRead));
numRead++;
if (numRead > 10) {
throw new RuntimeException("VarLong is too big");
}
} while ((read & 0b10000000) != 0);
return result;
}
public static void writeVarInt(DataOutputStream dos, int value) throws Exception {
do {
byte temp = (byte)(value & 0b01111111);
value >>>= 7;
if (value != 0) {
temp |= 0b10000000;
}
dos.writeByte(temp);
} while (value != 0);
}
public static void writeVarLong(DataOutputStream dos, long value) throws Exception {
do {
byte temp = (byte)(value & 0b01111111);
value >>>= 7;
if (value != 0) {
temp |= 0b10000000;
}
dos.writeByte(temp);
} while (value != 0);
}
public static void writeString(DataOutputStream out, String string, Charset charset) throws Exception {
byte [] bytes = string.getBytes(charset);
writeVarInt(out, bytes.length);
out.write(bytes);
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Проблема следующая: При парсинге sparql запроса я получаю упрощённое ast и мне нужно его передать в стороннюю библиотеку для дальнейшей обработки,...
Изучаю Retrofit2, пытаюсь получить токен Yandex disk, в документации яндекса написано, чтобы получить токен необходимо для начала подтвердить разрешения...
В разметке активити есть область, в которой должны поместиться изображения(от 1 до 10)Соответственно они должны заполнять всю эту область...
Заметил что с размерами экрана на телефонах творится что-то непонятноеРешил проверить - создал 3 блока шириной 1080px, 967px(подобрал для своего...