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客戶端框架
- 【Java】Java多執行緒實現的聊天客戶端和伺服器Java執行緒客戶端伺服器
- Netty原始碼分析(三):客戶端啟動Netty原始碼客戶端
- Java UDP伺服器和客戶端原始碼 -javarevisitedJavaUDP伺服器客戶端原始碼
- MQTT客戶端JAVA程式碼----fusesource mqtt-clientMQQT客戶端Javaclient
- netty系列之:使用netty搭建websocket客戶端NettyWeb客戶端
- 小弟求救伺服器-客戶端程式伺服器客戶端
- netty系列之:自建客戶端和HTTP伺服器互動Netty客戶端HTTP伺服器
- .net客戶端呼叫activeMQ程式碼客戶端MQ
- Java OAuth 2.0 客戶端程式設計(二): 客戶端憑據授權JavaOAuth客戶端程式設計
- java websocket 客戶端JavaWeb客戶端
- 使用Netty實現HTTP2伺服器/客戶端的原始碼和教程 - BaeldungNettyHTTP伺服器客戶端原始碼
- Tars-Java客戶端原始碼分析Java客戶端原始碼
- 分散式訊息系統Kafka Java客戶端程式碼分散式KafkaJava客戶端
- Netty入門系列(1) --使用Netty搭建服務端和客戶端Netty服務端客戶端
- Redis原始碼剖析——客戶端和伺服器Redis原始碼客戶端伺服器
- Java中OpenAI API客戶端原始碼教程JavaOpenAIAPI客戶端原始碼
- Zookeeper Java 客戶端搭建Java客戶端
- Zookeeper--Java客戶端Java客戶端
- [Redis 客戶端整合] Java 中常用Redis客戶端比較Redis客戶端Java
- Flutter 新聞客戶端 - 06 程式碼規範、業務程式碼組織、新聞首頁實現Flutter客戶端
- FTP客戶端c程式碼功能實現FTP客戶端C程式
- plsql 客戶端亂碼SQL客戶端
- Java OAuth 2.0 客戶端程式設計(三):認證碼授權JavaOAuth客戶端程式設計
- Qt實現網路聊天室(客戶端,服務端)QT客戶端服務端
- zookeeper的Java客戶端APIJava客戶端API
- JAVA FTP客戶端問題JavaFTP客戶端
- IM即時通訊設計 高併發聊天服務:伺服器 + qt客戶端(附原始碼)伺服器QT客戶端原始碼
- 求助:c#客戶端如何跟java伺服器通訊C#客戶端Java伺服器
- IE客戶客戶端程式開發的利器Bindows客戶端
- 透過程式碼改變客戶端所顯示的語言型別 (轉)客戶端型別
- 雲伺服器ASP判斷客戶端是手機或電腦程式碼伺服器客戶端
- electron+vue 仿微信客戶端聊天|electron 仿微信介面|electron 聊天例項Vue客戶端
- Windows網路程式設計附書程式碼(簡單的伺服器與客戶端)Windows程式設計伺服器客戶端
- 胖客戶端程式總結客戶端
- C++客戶端程式(socket)C++客戶端
- UNIX網路程式設計學習(8)--伺服器端顯示客戶端的IP地址和埠號程式設計伺服器客戶端