Простая схема отправки информации на сервер/клиент

necauqua

когда-то был anti344
Администратор
1,216
27
172
Итак. Создаем класс PacketHandler(на самом деле название может быть любым, если до вас все еще не дошло).
Выглядеть он должен примерно так:
Код:
@Sharable //Без этого, кстати, будет краш
public class PacketHandler extends SimpleChannelInboundHandler<FMLProxyPacket>{

    private static FMLEmbeddedChannel server;
    private static FMLEmbeddedChannel client;

    public static void init(){
        EnumMap<Side, FMLEmbeddedChannel> channels = NetworkRegistry.INSTANCE.newChannel("уникальное_название_канала_modid_подойдет", new PacketHandler())
        client = channels.get(Side.CLIENT);
        server = channels.get(Side.SERVER);
    }

    public static void sendToServer(ByteBuf data){ //ByteBuf - забавный класс, его методы узреете в IDE, а получить его можно вызовом Unpooled.buffer()
        client.attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.TOSERVER);
        client.writeAndFlush(new FMLProxyPacket(data, "то_самое_название_канала_запихните_в_константу_а_то_забудете")).addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE);
     }

//cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper - другие типы "посыла" - игрокам, в измерение и т. д. как в старом добром PacketDispatcher-е.

    @Override
    public void  channelRead0(ChannelHandlerContext ctx, FMLProxyPacket msg){
        ByteBuf data = msg.payload();//Ваша инфа.
        switch(data.readByte()){Делайте чего хотите, но крайне рекомендую делать так
            case 0:
                doMagic1();
                break;
            case 1:
                doMagic2();
                break;
            default:
                sysout("WRONG PACKET RECEIVED");
        }
    }
}
Вот и все, вызываете PacketHandler.init() из init метода и готово.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Внезапно понял, что так конечно-же удобно, но если надо делать отдельные классы для пакетов, то тау можно сделать еще проще.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
На Scala этот простой и короткий способ работать не захотел, психанул, посмотрел кучу туторов по Netty, написал свой хандлер с нуля, и теперь у меня все работает как надо вообще.
[merge_posts_bbcode]Добавлено: 24.04.2014 19:47:10[/merge_posts_bbcode]

Ну почти с нуля, это же Netty.
 

NAS

7
0
А можно поподробней о отправки данных? И можно их отправлять при вводе команды?
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
[типа цитата]
//cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper - другие типы "посыла" - игрокам, в измерение и т. д. как в старом добром PacketDispatcher-е.
[merge_posts_bbcode]Добавлено: 03.05.2014 22:24:51[/merge_posts_bbcode]

И там есть sendToPlayer(Player) - от сервера на определённый клиент(то бишь при вводе команды майнкрафт отправляет пакет на сервер, говоря ему, "игрок такой-то ввёл такую-то команду", сервер осознает, что игрок прописал именно твою команду, передает управление тебе, где ты и отсылаешь какой бы то ни было пакет обратно на клиент. Замечательно конечно, но только так и можно(по-крайней мере, пока-что)).
 

NAS

7
0
anti344 написал(а):
[типа цитата]
//cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper - другие типы "посыла" - игрокам, в измерение и т. д. как в старом добром PacketDispatcher-е.
[merge_posts_bbcode]Добавлено: 03.05.2014 22:24:51[/merge_posts_bbcode]

И там есть sendToPlayer(Player) - от сервера на определённый клиент(то бишь при вводе команды майнкрафт отправляет пакет на сервер, говоря ему, "игрок такой-то ввёл такую-то команду", сервер осознает, что игрок прописал именно твою команду, передает управление тебе, где ты и отсылаешь какой бы то ни было пакет обратно на клиент. Замечательно конечно, но только так и можно(по-крайней мере, пока-что)).
А вот можно ли какнить провернуть это от плагина bukkit а не от мода?
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Ну это уже к английским форджевским и MCPC-шным туторам, ибо я хз.
 
509
2
Никогда не работала с пакетами.
Можете подсказать,какую конструкцию писать для отправки пакета. :blush:
 
476
9
39
Такой вопрос, а как принять пакет?
 
675
2
Agravaine написал(а):
Тоже устарело.
Только если морально. У меня все прекрасно работает на 1.7.10, да и идея того, что пакет сам решает, что с ним произойдет мне нравится.

Хотя вот эта строчка напрягает:
 It can cause memory leaks. If you are using this, consider switching to using FMLIndexedMessageToMessageCodec, or better yet, use the simpleimpl Message functionality.

Скорее всего скоро последую твоему совету.
 
476
9
39
я на 1.6.4
 
476
9
39
Я новичок так что не надо писать например "Сам напиши если такой умный " и.т.д и.т.п . Так вот кто нибудь если сможет напишите тему про прокси , как они работаю и с  чем их едят . Да и сам я не знаю что это, но в туториалах упоминают их часто !
 
Сверху