사이트 로그인
2018.04.21 15:40
Netty3 - > Netty4 넘어오게되면서 적용하는 소스도 좀 바뀌었는데요
제가 직접 사용했었던 소스는 팩자체가 너무 달라서 그대로 올릴수없어 인터넷에 떠도는 공개팩 주워서
새로 구현후 테스트 마치고 배포합니다. 팩은 일팩인데 정확히는 잘모르겠습니다.
저는 에바, 로봇 ,코어 등 이런 명칭으로 분류하지않고 그냥 일팩 으로 통합합니다.
첨부파일 압축을 풀면 Netty 폴더안 4개파일 , CircleArray.java, netty-all-4.1.11.Final.jar 가 들어있는데
예전에 성능 향상을 위해서 xx연구소등 에 원형배열 이라는 CircleArray 를 구현하는방법과 예제소스를 공개했었는데요
그부분도 같이 적용해놨습니다. 전체적으로 굴러다니던 공개팩에다가 구현한 소스이기때문에 본인 팩에 맞게끔 수정을 하셔야합니다.
최대한 편하게 주석처리를 해놨으니 잘살펴보시기바람니다.
먼저 netty-all-4.1.11.Final.jar 파일을 팩 폴더 의 lib 폴더안에 넣어주세요
(라이브러리를 적용하는 방법은 따로 설명드리진 않겠습니다. 수정해야할부분 : 이클립스 의 라이브러리 적용,build.xml, ServerStart.bat)
Netty 폴더 와 CircleArray.java 를 통으로 l1j.server.network 위치에 넣어주세요 network폴더가 없으면 만드셔도 되고
적당한 위치에 넣은후 각 소스파일의 package 등 경로를 수정하셔도 무방합니다.
- 적용하시는 중에 모르는 부분이나 잘안되는부분이 있다면 언제든 말씀하시면 도움을 드리겠습니다-
Server.java
import 추가
import io.netty.bootstrap.ServerBootstrap;
import io.netty.buffer.PooledByteBufAllocator;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.util.internal.SystemPropertyUtil;
import l1j.server.network.Netty.InProtocolHandler;
import l1j.server.network.Netty.OutProtocolHandler;
import l1j.server.network.Netty.PacketDecoder;
import l1j.server.network.Netty.PacketEncoder;
ServerBootstrap , Channel 변수 추가
private static ServerBootstrap sb;
private static Channel channel;
startGameServer() 함수 내부 수정 및 추가 mina 관련 부분은 삭제 또는 주석처리해주세요
try {
/**클라연결 쓰레드*/
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
/**io처리 쓰레드 (쓰레드 : cpu core * 2) */
EventLoopGroup workerGroup = new NioEventLoopGroup(Math.max(1, SystemPropertyUtil.getInt("io.netty.eventLoopThreads",
Runtime.getRuntime().availableProcessors() * 2)));
sb = new ServerBootstrap();
sb.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>(){//childHandler
@Override
protected void initChannel(SocketChannel ch)
throws Exception {
ChannelPipeline p = ch.pipeline();
p.addLast("decode", new PacketDecoder());
p.addLast("encoder", new PacketEncoder());
p.addLast(new OutProtocolHandler(), new InProtocolHandler());
}
});
/**
* 각종 설정등은 해당서버 와 컴퓨터 환경에따라 달라질수있으므로
* 부수적인 부분은 모두 생략하겠습니다.
**/
sb.option(ChannelOption.TCP_NODELAY, true);
sb.option(ChannelOption.SO_KEEPALIVE, false);
sb.option(ChannelOption.SO_BACKLOG, 512);
/**포트 번호 설정 및 오픈*/
channel = sb.bind(Config.GAME_SERVER_PORT).sync().channel();
} catch (InterruptedException e) {
e.printStackTrace();
}
LineageClient.java
import 추가
import io.netty.buffer.ByteBuf;
import io.netty.channel.Channel;
적당한 위치에 추가, LineageEncryption 부분은 리니지 암호화 클래스이며 사용하시는게 다르면 그에 맞게 수정해주시면됩니다.
public Channel channel;
public LineageEncryption le;
LineageClient 생성자 부분은 이미 있는걸 수정하셔도 되고 각팩에 알맞게 수정하시기바람니다.
추가되는부분은 channel = _channel;, le = key; 부분입니다.
/**
* LineageClient 생성자
* @param session
* @param key
*/
public LineageClient(Channel _channel, LineageEncryption key){
channel = _channel;
le = key;
if (Config.AUTOMATIC_KICK > 0) {
observer.start();
}
packetHandler = new PacketHandler(this);
_threadPool.execute(hcPacket);
_threadPool.execute(movePacket);
}
sendPacket 함수 수정
/**
* 패킷 전송
* @param bp
*/
public synchronized void sendPacket(ServerBasePacket bp){
try{
channel.writeAndFlush(bp);
} catch (Exception e) {}
}
출처 투데이