一、netty初學,簡單的echo伺服器,客戶端
<dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.0.29.Final</version> </dependency> |
EchoServerChannelHandler
packagetest01;
importio.netty.buffer.ByteBuf;
importio.netty.buffer.Unpooled;
importio.netty.channel.ChannelFutureListener;
importio.netty.channel.ChannelHandlerContext;
importio.netty.channel.ChannelInboundHandlerAdapter;
importio.netty.util.CharsetUtil;
/**
* Created by wujiazhen on 2018/1/15.
*/
public class |
packagetest01; importio.netty.bootstrap.ServerBootstrap; importio.netty.channel.*; importio.netty.channel.nio.NioEventLoopGroup; importio.netty.channel.socket.SocketChannel; importio.netty.channel.socket.nio.NioServerSocketChannel; importjava.net.InetSocketAddress; importjava.util.concurrent.TimeUnit; /** * Created by wujiazhen on 2018/1/15. */ public classEchoServer { private int port; publicEchoServer(){}; publicEchoServer(intport){ this.port=port; } public static void main(String args[]){ newEchoServer(2000).start(); } public void start() { NioEventLoopGroup group =newNioEventLoopGroup(); try{ /* 1.建立 EventLoopGroup 2.建立 ServerBootstrap 3.指定使用 NIO 的傳輸 Channel 4.設定 socket 地址使用所選的埠 5.新增 EchoServerHandler 到 Channel 的 ChannelPipeline */ ServerBootstrap bootstrap = newServerBootstrap() .channel(NioServerSocketChannel.class) .group(group) .localAddress(newInetSocketAddress(this.getPort())) .childHandler(newChannelInitializer<SocketChannel>() { public void initChannel(SocketChannel socketChannel)throwsException { /* ChannelInitializer 。當一個新的連線被接受,一個新的子 Channel 將被建立, ChannelInitializer 會新增我們EchoServerHandler 的例項到 Channel 的 ChannelPipeline。 正如我們如前所述,如果有入站資訊,這個處理器將被通知。 */ socketChannel.pipeline().addLast(newEchoServerChannelHandler()); } }); // 6.繫結的伺服器;sync 等待伺服器關閉 ChannelFuture future = bootstrap.bind().sync(); System.out.println(EchoServer.class.getName() + " started and listen on "+ future.channel().localAddress()); //7.關閉 channel 和 塊,直到它被關閉 future.channel().closeFuture().sync(); }catch(InterruptedException e) { e.printStackTrace(); }finally{ try{ group.shutdownGracefully().sync(); }catch(InterruptedException e) { e.printStackTrace(); } } } public int getPort() { returnport; } public void setPort(intport) { this.port= port; } } |
packagetest01; importio.netty.buffer.ByteBuf; importio.netty.buffer.Unpooled; importio.netty.channel.ChannelHandlerContext; importio.netty.channel.SimpleChannelInboundHandler; importio.netty.util.CharsetUtil; /** * Created by wujiazhen on 2018/1/15. */ public classEchoClientChannelHandlerextendsSimpleChannelInboundHandler { protected void channelRead0(ChannelHandlerContext channelHandlerContext, Object msg)throwsException { ByteBuf in = (ByteBuf)msg; System.out.println("client receive:"+in.toString(CharsetUtil.UTF_8)); } @Override public void channelActive(ChannelHandlerContext ctx)throwsException { System.out.println("connect success"); ctx.writeAndFlush(Unpooled.copiedBuffer("客戶端:建立.....",CharsetUtil.UTF_8)); super.channelActive(ctx); } } |
packagetest01; importio.netty.bootstrap.Bootstrap; importio.netty.channel.ChannelFuture; importio.netty.channel.ChannelInitializer; importio.netty.channel.nio.NioEventLoopGroup; importio.netty.channel.socket.SocketChannel; importio.netty.channel.socket.nio.NioServerSocketChannel; importio.netty.channel.socket.nio.NioSocketChannel; /** * Created by wujiazhen on 2018/1/15. */ public classEchoClient { public static void main(String[] args){ newEchoClient().start(); } public void start(){ NioEventLoopGroup group =newNioEventLoopGroup(); try{ Bootstrap bootstrap =newBootstrap(); bootstrap.group(group) //區別與服務端的channel,客戶端用NioSocketChannel .channel(NioSocketChannel.class) .remoteAddress("127.0.0.1",2000) .handler(newChannelInitializer<SocketChannel>() { protected void initChannel(SocketChannel socketChannel)throwsException { socketChannel.pipeline().addLast(newEchoClientChannelHandler()); } }); ChannelFuture sync = bootstrap.connect().sync(); sync.channel().closeFuture().sync(); }catch(InterruptedException e) { e.printStackTrace(); }finally{ try{ group.shutdownGracefully().sync(); }catch(InterruptedException e) { e.printStackTrace(); } } } } |
相關推薦
Android與Java NIO實現簡單Echo伺服器與客戶端
上一篇用Java IO來做了個Demo,於是乎進一步,用Java NIO來做一個。NIO的優勢在於非阻塞。使用了Selector在一個執行緒裡進行輪詢,就能夠完成接入、收\發訊息的操作,不需要每建立一個連線都新啟動一個執行緒的方式。Server端程式碼:public clas
一、netty初學,簡單的echo伺服器,客戶端
無論伺服器還是客戶端都是由下面兩步組成 1、ChannelHandler 用與處理各種事件的邏輯處理。決定了連線建立後和接收到資訊後該如何處理。 直接或簡接要實現ChannelInboundHandler 介面. 2、Bootstrap啟動伺服器或客戶端 伺服器用 Serv
常用的幾種清除float浮動的方法 一、浮動產生原因 簡單地說,浮動是因為使用了float:left或float:right或兩者都有而產生的浮動,導致樣式缺失或者不正確顯示等問題; 二、浮動產生
一、浮動產生原因 簡單地說,浮動是因為使用了float:left或float:right或兩者都有而產生的浮動,導致樣式缺失或者不正確顯示等問題;二、浮動產生負作用1、背景不能顯示由於浮動產生,如果對父級設定了(CSS background背景)CSS背景顏色或CSS背景圖片,而父級不能被撐開,所以導致CSS
第一個Netty程式——構建和執行Echo伺服器和客戶端
在構建之前,需要安裝開發環境:JDK和Apache Maven以及IDE。 pom檔案: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-ins
編寫測試簡單的伺服器和客戶端 (C++)(十一)
本教程介紹如何用 C++ 編寫伺服器 Service 和客戶端 Client 節點。 內容 編寫Service節點 程式碼 程式碼解釋 編寫Client節點 程式碼 程式碼解釋 編譯節點 編譯節點 編寫Service節點
ROS學習筆記18 (編寫簡單的伺服器和客戶端 (C++))
1 編寫Service節點 這裡,我們將建立一個簡單的service節點("add_two_ints_server"),該節點將接收到兩個整型數字,並返回它們的和。 進入先前你在catkin workspace教程中所建立的beginner_tutorials包所在的目錄
ROS學習筆記19 (編寫簡單的伺服器和客戶端 (Python))
1 編寫服務端節點 我們會建立服務端節點 ("add_two_ints_server") ,節點接收兩個整型數字,並返回和 進入beginner_tutorials包 $ roscd beginner_tutorials 確保你確保已經在之前建立好AddTwoInts
(4)編寫簡單的伺服器和客戶端
目錄 編寫Service節點 程式碼 程式碼解釋 編寫Client節點 程式碼 程式碼解釋 編譯節點 編譯節點
libevent學習之三:簡單的伺服器和客戶端
1.伺服器#include <stdio.h> #include <time.h> #include <event2/bufferevent.h> #include <event2/buffer.h> #include <
Linux下簡單的網路程式設計筆記(模擬簡單的伺服器與客戶端的通訊 1-伺服器端)
一.伺服器端 (一).建立連線的條件:伺服器必須處於監聽狀態,由客戶端發起連線請求 bind之前可新增以下程式碼解決關閉伺服器後端口仍被佔用的問題 // 設定套接字選項避免地址使用錯誤 int on=1; if((setsoc
一個簡單的伺服器與客戶端程式
最近在學習《深入理解計算機系統》,看到linux系統級的IO以及,socket通訊,所以乾脆參考書上例程,自己著手寫一個客戶端與伺服器的小程式。 並未使用csapp封裝好的open_clientfd與open_listenfd還有RIO包 主要功能就兩個: 1.伺服器讀客戶
linux下的簡單檔案伺服器和客戶端程式
本文是我的一次作業,由於花了很多精力,記下來以後可能還會用到。程式碼部分是從老師那拷貝的,作業是實現程式碼中沒有實現的put和delete命令對檔案的操作。我對程式碼的理解都做了標註,有點亂,但閱讀方便。本程式的命令要求 Dir/ls 後接字串,列出伺服器的某個目錄的內容
ROS學習筆記7-編寫簡單的伺服器和客戶端 (C++)
1 前提在/catkin_ws/src/beginner_tutorials/srv 目錄下建立好AddTwoInts.srv 1 int64 a 2 int64 b 3 --- 4 int64 sum 2 編寫server節點[~/catkin_ws/src/
【隨堂筆記】unity開發中Socket的用法(一,實現伺服器與客戶端簡單的連結)
實現了簡單的連結,也增加了客戶端沒有連結到伺服器的自動重連 伺服器程式碼 using System; using System.Net; using System.Net.Sockets; namespace SeverSocket { class Program
socket程式設計(一),實現伺服器與客戶端簡單通訊
本節主講客戶端向服務傳送資訊,伺服器轉發給客戶端,當然也可以稍微改一下程式碼可以實現互傳訊息,不再贅述。 難點在於伺服器端的程式碼思路: (1)主程式Socket socket=server.acc
一、JavaSE_集合(集合簡單認識、Collection、List)
pos lib 12px lpad wid 認識 order 既然 如何 集合(一) 一、集合的簡單認識 1.侃一侃 集合,說白了就是存放數據的,還記得OOP當中,我們曾說過,OOP將數據放在第一位,然後再考慮操作數據的算法。也就是研究數據的存儲方式,或者說是數據結構,
二、Netty實現伺服器與客戶端完整互動連線實戰
本節內容是程式碼實現伺服器與客戶端完整連線過程。整體把控netty的工作流程。我們先不要被某個類,某個api的封裝深入挖掘,這樣你會踩很多坑,陷入進去而拔不出來,後面我會一一講解,原始碼剖析工作原理。這就是我個人學習技術的一種方法,深入淺出
大資料之scala(一) --- 安裝scala,簡單語法介紹,條件表示式,輸入和輸出,迴圈,函式,過程,lazy ,異常,陣列
一、安裝和執行Scala解釋程式 --------------------------------------------- 1.下載scala-2.11.7.msi 2.管理員執行--安裝 3.進入scala/bin,找到scala.bat,管理員執行,進入scala命
Socket的應用(一)——建立一個簡單的回顯客戶端/伺服器
在這篇文章中,我們將利用Python的Socket模組,編寫一個簡單的本地TCPC/S應用:建立Server和Client,在開始時Server等待Client的請求過程中,Server顯示出等待資訊,之後Client連線上Server併發送訊息,最後Server則要回顯出來自客戶端的所有輸出,併發
【隨堂筆記】unity中socket的用法(二、伺服器與客戶端之間簡單的資料傳遞)
主要實現伺服器與客戶端之間簡單的資料傳輸(單次) 伺服器程式碼 using System; using System.Net; using System.Net.Sockets; namespace SeverSocket { class Program {