日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

netty Demo

發布時間:2025/3/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 netty Demo 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天寫了一個helloworld版本的netty程序,跟大家分享一下:

首先需要的包是:netty-all-4.1.25.Final.jar

客戶端:

StrClient.java

package client;

import java.net.InetSocketAddress;

import io.netty.bootstrap.Bootstrap;
import io.netty.bootstrap.ChannelFactory;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;

?

/**
*1. 搞一個Bootstrop 對象
*
*2. 封裝Bootstrop 對象
*
*3. 寫Handler類 也就是所有的業務邏輯
*
* @author zx
*
*/
public class StrClient {
//分配一個ip和端口號
private String host;
private int port;
private NioEventLoopGroup nioEventLoopGroup;
public StrClient(String host, int port) {
this.host = host;
this.port = port;
}

//啟動項目 ip地址是 本地 端口號是888
public static void main(String[] args) throws InterruptedException {
new StrClient("localhost", 888).start();
}

public void start() throws InterruptedException {
try {
//客戶端的引導類,啟動網絡客戶端 Bootstrap有很多客戶端的屬性
Bootstrap bootstrap = new Bootstrap();
//可以理解成是一個線程池,用這個線程池來處理連接和接收數據
nioEventLoopGroup = new NioEventLoopGroup();
bootstrap.group(nioEventLoopGroup) //多線程處理,注冊一下這個組
.channel(NioSocketChannel.class) //制定通道類型是NioSocketChannel
.remoteAddress(new InetSocketAddress(host, port)) //注冊遠程服務器的地址
.handler(new ChannelInitializer<SocketChannel>() {
//↑模板代碼/
@Override
protected void initChannel(SocketChannel ch) throws Exception {
//業務邏輯
ch.pipeline().addLast(new StrClientHandler());
}
//↓模板代碼/
});
//開始連接服務器
ChannelFuture channelFuture = bootstrap.connect().sync(); //等到連接成功,否則一直阻塞線程
channelFuture.channel().closeFuture().sync(); //接收數據之后阻塞
} catch (Exception e) {
e.printStackTrace();
} finally {
nioEventLoopGroup.shutdownGracefully().sync();
}
}
}

StrClientHandler.java

package client;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;

public class StrClientHandler extends SimpleChannelInboundHandler<ByteBuf> {

//客戶端連接服務器后會調用 這里面可以發送請求
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
System.out.println("client -> 開始連接服務器發送數據...");
byte[] bytes = "get current time".getBytes();
ByteBuf buffer = Unpooled.buffer(bytes.length); //構造一個數組存數據
buffer.writeBytes(bytes); //給buffer寫數據 在數組里面寫入的數據
ctx.writeAndFlush(buffer); //將這個信息交給上下文 進入pipline 如果有第二個Handler也會把這個數據給這第二個Handler
}

//從服務器端接到數據之后
@Override
protected void channelRead0(ChannelHandlerContext ch, ByteBuf msg) throws Exception {
System.out.println("client -> 讀取服務器返回的對象...");
//反序列化
byte [] bytes = new byte [msg.readableBytes()]; //將這個2進制的數據寫入數組里
msg.readBytes(bytes); //實際上是寫入數組中
String messageBody = new String (bytes,"UTF-8");
System.out.println("client -> 接到數據,內容是: " + messageBody);
}

//發生異常的時候會調用
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
//打印出錯的原因
cause.printStackTrace();
//發生異常的時候就會關閉這個上下文,中斷數據的傳輸
ctx.close();
}

}

?

服務端:

StrServer.java

?

package server;

?

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;

?

public class StrServer {
private int port;
private NioEventLoopGroup nioEventLoopGroup;

?

public StrServer(int port) {
this.port = port;
}

?

public static void main(String[] args) throws InterruptedException {
new StrServer(888).start();
}

?

private void start() throws InterruptedException {
try {
ServerBootstrap serverBootstrap = new ServerBootstrap();
nioEventLoopGroup = new NioEventLoopGroup();
serverBootstrap.group(nioEventLoopGroup)
.channel(NioServerSocketChannel.class)
.localAddress("localhost", port)
.childHandler(new ChannelInitializer<Channel>() {
//業務邏輯
@Override
protected void initChannel(Channel ch) throws Exception {
ch.pipeline().addLast(new StrServerHandler());
}
});
ChannelFuture channelFuture = serverBootstrap.bind().sync();
System.out.println("Server -> 服務啟動成功 監聽端口, " + port);
channelFuture.channel().closeFuture().sync();
}catch (Exception e) {
e.printStackTrace();
} finally {
nioEventLoopGroup.shutdownGracefully().sync();
}
}
}

StrServerHandler.java

package server;

import java.util.Date;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

public class StrServerHandler extends ChannelInboundHandlerAdapter {

/**
*
*@param ctx 上下文
*@param msg 傳來的具體的數據
*
*/
//讀取客戶端發來的數據 這個方法會被調起,在服務器讀取數據的時候
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
System.out.println("Server -> 接到數據,開始處理...");
ByteBuf buf = (ByteBuf)msg; //將傳過來的ByteBuf強制轉換
byte [] req = new byte[buf.readableBytes()]; //2進制數組
buf.readBytes(req); //將req的內容寫到buf中
//反序列化
String requestbody = new String (req, "UTF-8");
System.out.println("Server -> 客戶端請求數據是: " + requestbody);
System.out.println("Server -> 開始寫回數據");
String currentTime = new Date().toString();
//封裝了數據的輸出
ByteBuf copiedBuffer = Unpooled.copiedBuffer(currentTime.getBytes());
ctx.write(copiedBuffer);

}

//數據讀取完成會調起
@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
ctx.flush();
}


//發生異常會被調用
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
ctx.close();
cause.printStackTrace();
}
}

運行服務端和客戶端的main即可啟動服務,

1. 服務端準備接受客戶端的請求信息;

2. 客戶端請求: get currentTime?

3. 服務端獲取到請求信息:get currentTime

4. 服務端準備返回數據: String responseBody = new Date() . toString();

5. 服務端返回數據

6. 客戶端獲取服務端返回的數據

?

轉載于:https://www.cnblogs.com/zx947240023/p/9178843.html

新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!

總結

以上是生活随笔為你收集整理的netty Demo的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美精品电影一区二区 | 毛片网站在线观看 | 99热这里是精品 | 羞羞的软件 | 久久久久久久成人 | 国产小视频在线免费观看 | 国产色无码精品视频国产 | 白又丰满大屁股bbbbb | 免费在线观看日韩 | 蜜桃视频久久一区免费观看入口 | 制服.丝袜.亚洲.另类.中文 | 日韩av在线免费观看 | 人妻av无码一区二区三区 | 艳妇臀荡乳欲伦交换在线播放 | 久久精品国产99国产精品 | 深爱激情久久 | 深夜福利视频导航 | 国产亚洲精品久久久久久青梅 | 丁香八月婷婷 | 日本一二三区在线 | 91av免费观看 | 乳揉みま痴汉4在线播放 | 97公开视频 | fexx性欧美| 人超碰 | jizz一区二区 | 欧美一区二区性久久久 | 男人与雌性宠物交啪啪 | 中文字幕国产专区 | 欧美成人aaaaⅴ片在线看 | 欧洲成人在线视频 | 精品一级少妇久久久久久久 | 免费一区二区三区视频在线 | 97在线免费公开视频 | 国产视频网 | 色网址在线 | 久久99伊人 | 国产第一精品 | www嫩草 | 亚洲一区二区综合 | 欧美一区二区在线免费观看 | 日韩精选 | 特级西西444www大精品视频 | 亚洲精品视频在线观看免费 | 久久电影一区二区 | 欧美伦乱| 伊人影院在线观看视频 | 欧美日韩一区二区在线视频 | 成人aaaa| 国产乱色精品成人免费视频 | 天天拍夜夜操 | 天天操天天操天天操 | 国产愉拍 | 日韩一级黄 | 999久久久国产精品 韩国精品一区二区 | 国产色婷婷一区二区三区竹菊影视 | 国产精品福利一区二区 | 欧美性猛交xxxx乱 | 男女做激情爱呻吟口述全过程 | 黄色的网站免费观看 | 69sex久久精品国产麻豆 | 久久综合加勒比 | 波多野结衣黄色网址 | 欧美三日本三级少妇三级99观看视频 | 麻豆精品av| 国产强被迫伦姧在线观看无码 | 伊人久久免费视频 | av免费在线观看网站 | 成人片黄网站色大片免费毛片 | 黄色链接视频 | 日本成人a| 午夜激情亚洲 | 反差在线观看免费版全集完整版 | 丝袜人妻一区二区 | 精品人妻伦一区二区三区久久 | 成人免费毛片日本片视频 | 超碰首页 | 免费毛片软件 | 国产拍拍拍拍拍拍拍拍拍拍拍拍拍 | 中文字幕日韩三级 | 国产黄色片在线播放 | 欧美一区二区三区四区在线观看 | 99香蕉视频 | 少妇第一次交换又紧又爽 | 黄色免费网站 | 日日艹夜夜艹 | 在线观看日韩国产 | 114国产精品久久免费观看 | 男ji大巴进入女人视频 | 91视频免费视频 | 日韩欧美一区二区三区四区五区 | 国产在线黄色 | 交专区videossex另类 | 欧美激情一级精品国产 | 看av网址| 国产精品麻豆一区 | 新版红楼梦在线高清免费观看 | 国产日产精品一区二区三区 | 日韩亚洲国产精品 |