Java Netty伺服器客戶端聊天示範程式碼
-
效果圖
-
依賴
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.36.Final</version>
</dependency>
- 客戶端程式碼
import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.util.CharsetUtil;
import java.nio.charset.Charset;
import java.util.Date;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class client {
public static void main(String[] args) {
final ExecutorService pool = Executors.newSingleThreadExecutor();
EventLoopGroup group = new NioEventLoopGroup();
try {
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(group).channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>(){
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
ChannelPipeline pipeline=socketChannel.pipeline();
pipeline.addLast(new SimpleChannelInboundHandler<ByteBuf>() {
@Override
public void channelActive(final ChannelHandlerContext ctx) throws Exception {
System.out.println("伺服器已上線!!!");
pool.execute(new Runnable() {
public void run() {
Scanner scanner=new Scanner(System.in);
String text="";
while (true){
text=scanner.nextLine();
if(text.toLowerCase().equals("bye")){
ctx.close();
}
ctx.writeAndFlush(Unpooled.copiedBuffer(text+ "\r\n ", Charset.forName("utf-8")));
System.out.println(new Date().toString()+" 【客戶端】:"+text);
}
}
});
}
@Override
protected void channelRead0(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf) throws Exception {
String str=byteBuf.toString(CharsetUtil.UTF_8);
System.out.println(new Date().toString()+"【伺服器】:"+str);
}
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
super.channelInactive(ctx);
System.out.println("連線斷開!!!");
System.exit(0);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
}
});
}
}); //自定義一個初始化類
ChannelFuture channelFuture = bootstrap.connect("localhost", 7000).sync();
System.out.println("客戶端已啟動");
channelFuture.channel().closeFuture().sync();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
group.shutdownGracefully();
}
}
}
- 伺服器端程式碼
import io.netty.bootstrap.ServerBootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.util.CharsetUtil;
import java.nio.charset.Charset;
import java.util.Date;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class server {
public static void main(String[] args) {
final ExecutorService pool = Executors.newSingleThreadExecutor();
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup(3);
try {
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(bossGroup,workerGroup).channel(NioServerSocketChannel.class).childHandler(new SimpleChannelInboundHandler<ByteBuf>() {
@Override
public void channelActive(final ChannelHandlerContext ctx) throws Exception {
System.out.println("客戶端已上線!!!");
pool.execute(new Runnable() {
public void run() {
Scanner scanner=new Scanner(System.in);
String text="";
while (true){
text=scanner.nextLine();
if(text.toLowerCase().equals("bye")){
ctx.close();
}
ctx.writeAndFlush(Unpooled.copiedBuffer(text+ "\r\n ", Charset.forName("utf-8")));
System.out.println(new Date().toString()+" 【伺服器】:"+text);
}
}
});
}
@Override
protected void channelRead0(ChannelHandlerContext ctx, ByteBuf byteBuf) throws Exception {
String str=byteBuf.toString(CharsetUtil.UTF_8);
System.out.println(new Date().toString()+"【客戶端】:"+str);
}
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
super.channelInactive(ctx);
System.out.println("連線斷開!!!");
System.exit(0);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
}
}); //自定義一個初始化類
ChannelFuture channelFuture = serverBootstrap.bind(7000).sync();
System.out.println("伺服器已啟動");
channelFuture.channel().closeFuture().sync();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
}
相關文章
- 編寫 Netty / RPC 客戶端【框架程式碼分析】NettyRPC客戶端框架
- [程式碼已開源]叢集聊天伺服器與客戶端開發伺服器客戶端
- Netty原始碼分析(三):客戶端啟動Netty原始碼客戶端
- Java UDP伺服器和客戶端原始碼 -javarevisitedJavaUDP伺服器客戶端原始碼
- netty系列之:使用netty搭建websocket客戶端NettyWeb客戶端
- netty系列之:自建客戶端和HTTP伺服器互動Netty客戶端HTTP伺服器
- 使用Netty實現HTTP2伺服器/客戶端的原始碼和教程 - BaeldungNettyHTTP伺服器客戶端原始碼
- Netty入門系列(1) --使用Netty搭建服務端和客戶端Netty服務端客戶端
- Tars-Java客戶端原始碼分析Java客戶端原始碼
- java websocket 客戶端JavaWeb客戶端
- Redis原始碼剖析——客戶端和伺服器Redis原始碼客戶端伺服器
- Java中OpenAI API客戶端原始碼教程JavaOpenAIAPI客戶端原始碼
- Zookeeper Java 客戶端搭建Java客戶端
- [Redis 客戶端整合] Java 中常用Redis客戶端比較Redis客戶端Java
- FTP客戶端c程式碼功能實現FTP客戶端C程式
- Flutter 新聞客戶端 - 06 程式碼規範、業務程式碼組織、新聞首頁實現Flutter客戶端
- Qt實現網路聊天室(客戶端,服務端)QT客戶端服務端
- IM即時通訊設計 高併發聊天服務:伺服器 + qt客戶端(附原始碼)伺服器QT客戶端原始碼
- zookeeper的Java客戶端APIJava客戶端API
- LINUX下完整的TCP epoll 伺服器和客戶端程式碼,用作備份LinuxTCP伺服器客戶端
- 雲伺服器ASP判斷客戶端是手機或電腦程式碼伺服器客戶端
- 「iOS」行車服務app 「客戶端、後端思路+程式碼」iOSAPP客戶端後端
- [jaeger] 二、客戶端使用 (Java版本)客戶端Java
- netty服務端監聽客戶端連線加入和斷開事件Netty服務端客戶端事件
- MQTT伺服器搭建服務端和客戶端MQQT伺服器服務端客戶端
- TCP通訊客戶端和服務端簡單程式碼實現TCP客戶端服務端
- netty系列之:搭建客戶端使用http1.1的方式連線http2伺服器Netty客戶端HTTP伺服器
- 看完這篇包你進大廠,實戰即時聊天,一文說明白:聊天伺服器+聊天客戶端+Web管理控制檯。伺服器客戶端Web
- 客戶端 post ,get 訪問伺服器客戶端伺服器
- Easyvision中的伺服器與客戶端伺服器客戶端
- 無密碼驗證:客戶端密碼客戶端
- JavaScript判斷手機、平板電腦客戶端程式碼JavaScript客戶端
- Java HTTP 客戶端的比較 - reflectoringJavaHTTP客戶端
- electron+vue 仿微信客戶端聊天|electron 仿微信介面|electron 聊天例項Vue客戶端
- 每個Java開發人員應該知道的五種RESTful客戶端程式碼JavaREST客戶端
- 服務端和客戶端 RESTful 介面上傳 Excel 的 Python 程式碼服務端客戶端RESTExcelPython
- Vite5+Electron聊天室|electron31跨平臺仿微信EXE客戶端|vue3聊天程式Vite客戶端Vue
- netty建立數萬客戶端連線,並主動發訊息Netty客戶端