當前位置:首頁 » 雲伺服器 » netty搭建游戲伺服器

netty搭建游戲伺服器

發布時間: 2022-11-21 18:59:27

Ⅰ 如何構建一個基於netty的後端伺服器

統一繼承ClientRequestModel,經過編碼統一轉化為domainMessage,交由disruptor來處理,其實oop里什麼繼承,實現,封裝思想,大部分都在圍繞一個東西在走,一句話,把看似各有稜角的東西如何轉化為共同的東西,求同存異啊

Ⅱ 如何構建一個基於netty的後端伺服器

最近在研究Netty來構建SOA架構,其中也包括了前端接入的HTTP/WebSocket方面的接入響應,而WebSocket方面的接入響應對於移動端的消息推送研發至關重要,這里就將在這塊研發時的非同步socket響應服務例子程序筆記記錄下來,系統總共分為4個處理類,即:
HttpRequestHandler -- HTTP請求處理類
TextWebSocketFrameHandler -- 對應Text消息的處理類
WebSocketServer -- 系統主類
WebSocketServerInitializer -- 服務主程序的初始化類
WebSocketServer 類代碼:
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
public final class WebSocketServer {
private int port = 0;
public WebSocketServer(int port) {
this.port = port;
}
public void run() throws Exception {
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new WebSocketServerInitializer())
.option(ChannelOption.SO_BACKLOG, 128)
.childOption(ChannelOption.SO_KEEPALIVE, true);

System.out.println("WebsocketChatServer 啟動了");
// 綁定埠,開始接收進來的連接
ChannelFuture f = b.bind(port).sync();
// 等待伺服器 socket 關閉 。在這個例子中,這不會發生,但你可以優雅地關閉你的伺服器。
f.channel().closeFuture().sync();
} finally {
workerGroup.shutdownGracefully();
bossGroup.shutdownGracefully();
System.out.println("WebsocketChatServer 關閉了");
}
}

Ⅲ 如何構建一個基於netty的後端伺服器

HttpRequestHandler -- HTTP請求處理類
TextWebSocketFrameHandler -- 對應Text消息的處理類
WebSocketServer -- 系統主類
WebSocketServerInitializer -- 服務主程序的初始化類
WebSocketServer 類代碼:
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
public final class WebSocketServer {
private int port = 0;
public WebSocketServer(int port) {
this.port = port;
}
public void run() throws Exception {
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new WebSocketServerInitializer())
.option(ChannelOption.SO_BACKLOG, 128)
.childOption(ChannelOption.SO_KEEPALIVE, true);

System.out.println("WebsocketChatServer 啟動了");
// 綁定埠,開始接收進來的連接
ChannelFuture f = b.bind(port).sync();
// 等待伺服器 socket 關閉 。在這個例子中,這不會發生,但你可以優雅地關閉你的伺服器。
f.channel().closeFuture().sync();
} finally {
workerGroup.shutdownGracefully();
bossGroup.shutdownGracefully();
System.out.println("WebsocketChatServer 關閉了");
}
}

Ⅳ 基於Netty開發的游戲伺服器,是如何做到分布式管理呢

看你是什麼游戲了,不同的游戲其伺服器分布式的實現方式也不相同。

Ⅳ netty框架做游戲伺服器怎麼樣

如果你指的是單機的話,不說Netty會怎麼樣,伺服器都有可能直接崩潰掉,你的算一下,按平均每鏈接傳輸數據1K,100W鏈接大概數據量會在1G左右,G級伺服器網卡也受不了的,我們在網路編程中對單機來講,成功解決了C10K的問題,這種M級別的鏈接,可能暫時解決不了。對於如此大的並發,一般我們都是通過負載均衡的方式進行處理,如新浪微博,同時在線100W以上,通過約100多個節點處理,每個節點也就才10000並發左右。

Ⅵ 如何構建一個基於netty的後端伺服器

xml工具採用xstram來處理,兩個字,方便。
json工具採用jackson\不知道和業界出名的fastjson\gson\sf.json有何區別,待鑒定。

客戶端的請求,統一繼承ClientRequestModel,經過編碼統一轉化為domainMessage,交由disruptor來處理,其實oop里什麼繼承,實現,封裝思想,大部分都在圍繞一個東西在走,一句話,把看似各有稜角的東西如何轉化為共同的東西,求同存異啊(比如,水,石頭,空氣等,如果在這一層,我們沒法統一用一個特徵來表示,我們可以先把它轉化為分子,那是不是可以用同一個東西來表示呢?如何高度抽象封裝,這真是一門藝術)。

Ⅶ 如何構建一個基於netty的後端伺服器

public class HttpServerPipelineFactory implements ChannelPipelineFactory {
private ChannelUpstreamHandler channelUpstreamHandler;

public ChannelPipeline getPipeline() throws Exception {
// Create a default pipeline implementation.
ChannelPipeline pipeline = pipeline();

// Uncomment the following line if you want HTTPS
//SSLEngine engine = SecureChatSslContextFactory.getServerContext().createSSLEngine();
//engine.setUseClientMode(false);
//pipeline.addLast("ssl", new SslHandler(engine));

pipeline.addLast("decoder", new HttpRequestDecoder());
// Uncomment the following line if you don't want to handle HttpChunks.
pipeline.addLast("aggregator", new HttpChunkAggregator(1048576));
pipeline.addLast("encoder", new HttpResponseEncoder());
// Remove the following line if you don't want automatic content compression.
pipeline.addLast("deflater", new HttpContentCompressor());
//pipeline.addLast("handler", new HttpRequestHandler());
pipeline.addLast("handler", channelUpstreamHandler);
return pipeline;
}

public void setChannelUpstreamHandler(ChannelUpstreamHandler channelUpstreamHandler) {
this.channelUpstreamHandler = channelUpstreamHandler;
}
}

相關spring配置

Java代碼
<bean id="httpServerPipelineFactory" class="com.yunchao.cm.network.http.HttpServerPipelineFactory">
<property name="channelUpstreamHandler" ref="httpRequestHandler"/>
</bean>

Java代碼
<bean id="httpRequestHandler" class="com.yunchao.cm.network.http.HttpRequestHandler">
<property name="urlMaps">
<map>
<entry key="/payorder">
<ref bean="payOrderCodecFactory"/>
</entry>
<entry key="/question">
<ref bean="questionCodecFactory"/>
</entry>
<entry key="/sms">
<ref bean="smsCodecFactory"/>
</entry>

代碼太多,不全部貼出來,後面整理一下放到我的github上去。

基如此,我們還是得定義一個handler,繼承simpleChannelUpstreamHander,並重寫了messageReceied方法,具體在這里。

Java代碼
QueryStringDecoder queryStringDecoder = new QueryStringDecoder(request.getUri());
String url = queryStringDecoder.getPath();

CodecFactory codecFactory = urlMaps.get(url);

if (null == codecFactory) {
logger.error("unsupported url:{} request.", url);
//sendError(ctx, BAD_REQUEST);
e.getChannel().close();
return;
}

//獲取cmwap網路中的手機號碼
String phone = PhoneUtils.getPhone(request.getHeader("x-up-calling-line-id"));

if (request.getMethod().equals(HttpMethod.POST)) {
ChannelBuffer content = request.getContent();
String postParams = content.toString(CharsetUtil.UTF_8);

logger.debug("request content:{}", postParams);

ClientRequestModel model = (ClientRequestModel) codecFactory.decode(postParams);
model.setProperty(model.MESSAGE_EVENT_KEY, e);
model.setProperty(model.HTTP_REQUEST_KEY, request);
model.setProperty(model.HTTP_PHONE_KEY, phone);

InetSocketAddress remoteAddress = (InetSocketAddress) e.getRemoteAddress();
model.setProperty(model.IP_KEY, remoteAddress.getAddress().getHostAddress());

logger.info("user request model:{}", model);

model.fireSelf();

Java代碼
@Override
public DomainMessage fireSelf() {
DomainMessage em = new DomainMessage(this);
EventUtils.fireEvent(em, "alipayNotifyState");
return em;
}

看到這里基本上能夠清楚了,是如何把客戶端請求包裝成ClientRequestModel了,且後面涉及到處理的對象,全部繼承它,在整個架構之
中,has a 優於 is
a,對於客戶端netty的一些對象,也是存儲在ClientRequestModel中,codec無非也是採用了xml/json/kv,如斯,實現
了位元組與對象之間的轉換。


此之外,突然想到剛來杭州工作的第一家公司,基於此,採用的架構師servlet充當伺服器,因為這是一個公司內部的server,而不是一個平台,採用
的數據格式也比較單一,就是xml,但是採用的外部類庫也是xstream來處理的,但是整個系統維持的日調用量也是在百萬級別,運用的client則是
採用httpclient,對於不同請求後面掛的handler,是在容器啟動時載入到內存中,其餘也沒有什麼亮點了。

Ⅷ 如何構建一個基於netty的後端伺服器

Netty服務端創建
當我們直接使用JDK NIO的類庫開發基於NIO的非同步服務端時,需要使用到多路復用器Selector、ServerSocketChannel、SocketChannel、ByteBuffer、SelectionKey等等,相比於傳統的BIO開發,NIO的開發要復雜很多,開發出穩定、高性能的非同步通信框架,一直是個難題。
Netty為了向使用者屏蔽NIO通信的底層細節,在和用戶交互的邊界做了封裝,目的就是為了減少用戶開發工作量,降低開發難度。ServerBootstrap是Socket服務端的啟動輔助類,用戶通過ServerBootstrap可以方便的創建Netty的服務端。

Ⅸ 如何構建一個基於netty的後端伺服器

最近在研究Netty來構建SOA架構,其中也包括了前端接入的HTTP/WebSocket方面的接入響應,而WebSocket方面的接入響應對於移動端的消息推送研發至關重要,這里就將在這塊研發時的非同步socket響應服務例子程序筆記記錄下來,系統總共分為4個處理類,...

熱點內容
怎麼在手機上更改wifi密碼 發布:2025-01-11 07:37:26 瀏覽:335
開機啟動serviceandroid 發布:2025-01-11 07:35:24 瀏覽:523
天龍八部腳本設置自動喊話 發布:2025-01-11 07:31:37 瀏覽:309
硒標准溶液配置為什麼要加鹽酸 發布:2025-01-11 07:27:51 瀏覽:253
怎麼做電腦編程 發布:2025-01-11 07:14:36 瀏覽:481
壓縮圓環 發布:2025-01-11 06:41:37 瀏覽:512
安卓背面是什麼字母 發布:2025-01-11 06:37:55 瀏覽:215
個人小程序怎麼購買雲伺服器 發布:2025-01-11 06:33:08 瀏覽:912
手機mc怎麼玩伺服器國際服 發布:2025-01-11 06:18:33 瀏覽:160
win2008ftp中文亂碼 發布:2025-01-11 06:10:03 瀏覽:871