1. 程式人生 > >利用Netty進行客戶端和服務端互動的入門示例

利用Netty進行客戶端和服務端互動的入門示例

Netty是基於事件驅動的、非同步的網路應用程式框架和工具,用以快速開發高效能、高可靠性的網路伺服器和客戶端程式。是一種NIO框架,下面從最簡單的Hello World示例開始,演示服務端和客戶端互動進行Netty互動。

1.首先,建立服務端

public class DiscardServer {
	
	private int port;
	
	public DiscardServer(int port) {
		super();
		this.port = port;
	}
	
	public void run() {
		//配置Server
				ServerBootstrap bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(
						Executors.newCachedThreadPool(),
						Executors.newCachedThreadPool()
				));
				
				//設定pipeFactory
				bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
					
					@Override
					public ChannelPipeline getPipeline() throws Exception {
						ChannelPipeline pipeline = Channels.pipeline(new DiscardServerHandler());
						return pipeline;
					}
				});
				
				//繫結server端埠
				bootstrap.bind(new InetSocketAddress(port));
	}

	public static void main(String[] args) {
		new DiscardServer(8080).run();
	}


	public int getPort() {
		return port;
	}


	public void setPort(int port) {
		this.port = port;
	}
	
	
}


2、建立服務端事件處理的站點Handler,裡面包含回撥方法用於處理與客戶端互動時的操作。

class DiscardServerHandler extends SimpleChannelHandler {
	
	@Override
	public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e)
			throws Exception {
		System.out.println("--------服務端-------");
		String str = "Hello world, I'm server";
		ChannelBuffer buffer = ChannelBuffers.buffer(str.length());
		buffer.writeBytes(str.getBytes());
		e.getChannel().write(buffer);
	}
	
	@Override
	public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
			throws Exception {
		ChannelBuffer buffer = (ChannelBuffer) e.getMessage();
		System.out.println("服務端接收到訊息:" + buffer.toString(Charset.defaultCharset()));
	}
	
}


3、建立客戶端

public class TimeClient {
	
	 private String host;  
	 private int port; 
	
	public TimeClient(String host, int port) {
		super();
		this.host = host;
		this.port = port;
	}
	
	public void run() {
		ClientBootstrap bootstrap = new ClientBootstrap( 
				new NioClientSocketChannelFactory(
						Executors.newCachedThreadPool(),
						Executors.newCachedThreadPool()
				)
			);
			
			bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
				//ChannelPipeline 管道、傳輸途徑
				@Override
				public ChannelPipeline getPipeline() throws Exception {
//					ChannelPipeline pipeline = Channels.pipeline();
//					pipeline.addLast("encode", new StringEncoder());
//					pipeline.addLast("decode", new StringDecoder());
//					pipeline.addLast("handler", new TimeClientHandler());
					return Channels.pipeline(new TimeClientHandler());
				}
			});
			
//			bootstrap.setOption("tcpNoDelay", true);
//			bootstrap.setOption("keepAlive", true);
			 // Start the connection attempt.  
			ChannelFuture future = bootstrap.connect(new InetSocketAddress(host, port));  
			 
			// Wait until the connection is closed or the connection attempt fails.  
			future.getChannel().getCloseFuture().awaitUninterruptibly();  
		
			// Shut down thread pools to exit.  
			bootstrap.releaseExternalResources();  

	}


	public static void main(String[] args) {
		new TimeClient("127.0.0.1", 8080).run();
	}



	public String getHost() {
		return host;
	}



	public void setHost(String host) {
		this.host = host;
	}



	public int getPort() {
		return port;
	}



	public void setPort(int port) {
		this.port = port;
	}
	
	
	
}


4、建立客戶端的Handler

class TimeClientHandler extends SimpleChannelHandler {
	
	//這個屬於事件相關的處理
	@Override
	public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e)
			throws Exception {
		System.out.println("-----------客戶端---------------");
		String msg = "Hello world, I'm client";
		ChannelBuffer buffer = ChannelBuffers.buffer(msg.length());
		buffer.writeBytes(msg.getBytes());
		e.getChannel().write(buffer);
	}
	
	 @Override  
	 public void messageReceived(  
	     ChannelHandlerContext ctx, MessageEvent e) {  
	 // Send back the received message to the remote peer.  
	 ChannelBuffer acceptBuff = (ChannelBuffer) e.getMessage();  
	 String info = acceptBuff.toString(Charset.defaultCharset());  
	 System.out.println("客戶端接收到訊息:" + info);  
	 e.getChannel().close();  
	 }  

	
}


5、先啟動server端,再啟動client端。可以分別在服務端和客戶端的控制檯看到如下訊息:

server console:
--------服務端-------
服務端接收到訊息:Hello world, I'm client

client console:
-----------客戶端---------------
客戶端接收到訊息:Hello world, I'm server

6、注意在handler中,傳遞字串必須以ChannelBuffer為載體,不能直接用String傳遞。
   當客戶端和服務端連線上後,先回調的是channelConnected方法;之後才是messageReceived方法。
   至此,就完成了Netty客戶端與服務端的簡單互動!

相關推薦

利用Netty進行客戶服務互動入門示例

Netty是基於事件驅動的、非同步的網路應用程式框架和工具,用以快速開發高效能、高可靠性的網路伺服器和客戶端程式。是一種NIO框架,下面從最簡單的Hello World示例開始,演示服務端和客戶端互動進行Netty互動。 1.首先,建立服務端 public class Dis

Netty實現客戶服務通信簡單例子

啟動服務 ali tty 過程 等等 服務器初始化 讀寫操作 extends ask Netty是建立在NIO基礎之上,Netty在NIO之上又提供了更高層次的抽象。 在Netty裏面,Accept連接可以使用單獨的線程池去處理,讀寫操作又是另外的線程池來處理。 Accep

Netty學習(3): 客戶服務的例子

服務端: package com.server; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import

cocos2dx3.x利用sokcet建立客戶服務 (二)

服務端: 初始化服務端 向指定客戶端傳送訊息 void sendMessage(HSocket socket, constchar* data, int count); 向所有客戶端傳送訊息 void sendMessage(const char* data, int c

Netty實現客戶服務的通訊

        Netty是Apache團隊的又一個優秀的Socket框架,它和mina是一個團隊開發的,所以很多思想是相同的,接下來,我們就來實現客戶端和服務端的雙向通訊。        首先,我們定義訊息型別:/** * 訊息型別 * @author 李熠 * *

cocos2dx3.x利用sokcet建立客戶服務(一)

Socke基類: 包括Socket的初始化,主要是windows上,在android上就不需要了 如果平臺為windows,則需要初始化 SocketBase::SocketBase() { _bInitSuccess = false; #if (CC_TARGET_PLA

客戶服務如何使用TokenSession

cnblogs blank style ssi exception font 統一 判斷 用戶 一、我們先解釋一下他的含義: 1、Token的引入:Token是在客戶端頻繁向服務端請求數據,服務端頻繁的去數據庫查詢用戶名和密碼並進行對比,判斷用戶名和密碼正確與否,並作

基於thrift的javapython分別作為客戶服務的調用實現

Coding except arr pes com ssa utf-8 encoding 中文亂碼 前面已經實現了純java的thrift的實現。 現在實現實現一下python作為客戶端和服務端的thrift的調用 1.python作為客戶端,java作為服務端 java服

netty4----netty5的客戶服務

服務端 處理 sock 一個 servers 線程不安全 inbound nio owa 服務端: package com.server; import io.netty.bootstrap.ServerBootstrap; import io.netty.channe

客戶服務根路徑“/”的區別

name 根路徑 ber AC jsp 後端 ffffff http 最簡 文章來源 : https://blog.csdn.net/zwt520123/article/details/76794446 JSP 變為 HTML 的問題 由上面可以看到,整個 Web

Python學習筆記1:簡單實現ssh客戶服務

bsp dev bre 客戶端 break 基於 bin listen 客戶 實現基於python 3.6。 server端: 1 __author__ = "PyDev2018" 2 3 import socket,os 4 server = socket.s

linux網絡編程之用socket實現簡單客戶服務的通信(基於UDP)

服務端 msg ets lin fgets err n) stderr tcp 單客戶端和服務端的通信(基於UDP) 代碼 服務端代碼socket3.c #include<sys/types.h> #include<sys/socket.h>

Linux下面安裝ftp客戶服務vsftp

在Linux下面使用ftp工具,必須有客戶端和服務端。 1、使用環境客戶端為Redhat Linux6.4系統,需要到iso檔案中找到對應的Packages包,版本一定要和os版本保持一致,Linux6.4系統的ftp版本號為ftp-0.17-53.el6.x86_64.rpm ,上傳到伺服

zookeeper客戶服務互動分析

原文連結 ZkClient        在使用ZooKeeper的Java客戶端時,經常需要處理幾個問題:重複註冊watcher、session失效重連、異常處理。      

python UDP客戶服務對話

‘’’ UDP客戶端 ‘’’ import socket #1,建立socker物件dgram SOCK_DGRAM—UDP s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #傳送資料 while True: a=input(“請輸入你

Redis---客戶服務

Redis---客戶端和服務端   文章轉載自:http://redisbook.readthedocs.io/en/latest/internal/redis.html http://www.spongeliu.com/category/linux https://blo

zookeeper之客戶服務的區別

客戶端是叢集外的訪問,服務端才是叢集上的提供服務的。   使用bin/zkServer.sh start開啟的zookeeper上的一個服務端,而使用bin/zkCli.sh是將客戶端連到服務端上。 客戶端可以通過服務端建立znode,刪除znode,寫znode,讀znod

基於TCP的客戶服務資料傳輸

功能描述: 從客戶端向服務端傳送字串,服務端接收之後,把字串轉成大寫,並返回給客戶端, 客戶端程式碼 import java.io.IOException; import java.io.InputStream; import java.io.OutputStrea

python實現一個簡單的thirft客戶服務

建立thrift檔案 service Hello { string get() } 使用thrift 建立服務需要的元件 thrift --gen py hello.thrif

Android客戶使用OkGo上傳檔案或者圖片,客戶服務程式碼分享

(一)上傳單個檔案或者圖片: 客戶端程式碼: /** * 儲存資料到伺服器 */ private void saveToInternet() { //上傳單個檔案 String url = Constants.USER_NET_ICON;   Fi