Grizzly快速入门
Grizzly框架組件
使用 Java?編程語(yǔ)言編寫可擴(kuò)展的服務(wù)器應(yīng)用程序一直很困難。在 Java 新 I/O API (NIO) 出現(xiàn)之前,線程管理問(wèn)題使服務(wù)器無(wú)法擴(kuò)展到數(shù)千個(gè)用戶。
Grizzly NIO 框架旨在幫助開發(fā)人員利用 Java? NIO API。Grizzly 的目標(biāo)是幫助開發(fā)人員使用 NIO 構(gòu)建可擴(kuò)展和強(qiáng)大的服務(wù)器,
并提供擴(kuò)展的框架組件:Web 框架 (HTTP/S)、WebSocket、Comet等!
快速開始
本章將介紹客戶端和服務(wù)器端如何開始使用Grizzly 2.3。
首先,有必要依靠正確的Grizzly 2.4 核心版本。
Maven開發(fā)人員將需要向pom添加以下依賴項(xiàng):
所有的Grizzly Maven工件都部署在Maven Central存儲(chǔ)庫(kù)中。
讓我們實(shí)現(xiàn)簡(jiǎn)單的Echo客戶端-服務(wù)器應(yīng)用程序。客戶端將從標(biāo)準(zhǔn)輸入中獲取用戶數(shù)據(jù),將數(shù)據(jù)發(fā)送到Echo服務(wù)器,并將服務(wù)器的響應(yīng)重定向到標(biāo)準(zhǔn)輸出。Echo服務(wù)器的職責(zé)是從網(wǎng)絡(luò)通道讀取數(shù)據(jù),并將相同的數(shù)據(jù)回顯到通道。
服務(wù)器
創(chuàng)建回聲過(guò)濾器(Echo filter)
首先,讓我們實(shí)現(xiàn)回聲過(guò)濾器(echo filter),該過(guò)濾器會(huì)將收到的消息(不考慮其類型)回顯到 Grizzly Connection。
import java.io.IOException; import org.glassfish.grizzly.filterchain.BaseFilter; import org.glassfish.grizzly.filterchain.FilterChain; import org.glassfish.grizzly.filterchain.FilterChainContext; import org.glassfish.grizzly.filterchain.NextAction;/*** Implementation of {@link FilterChain} filter, which replies with the request* message.*/ public class EchoFilter extends BaseFilter {/*** Handle just read operation, when some message has come and ready to be* processed.** @param ctx Context of {@link FilterChainContext} processing* @return the next action* @throws java.io.IOException*/@Overridepublic NextAction handleRead(FilterChainContext ctx)throws IOException {// Peer address is used for non-connected UDP Connection :)final Object peerAddress = ctx.getAddress();final Object message = ctx.getMessage();ctx.write(peerAddress, message, null);return ctx.getStopAction();} }服務(wù)器初始化代碼
服務(wù)器的所有FilterChain塊都已準(zhǔn)備好-讓我們初始化并啟動(dòng)服務(wù)器。
import java.io.IOException; import java.nio.charset.Charset; import java.util.logging.Logger; import org.glassfish.grizzly.filterchain.FilterChainBuilder; import org.glassfish.grizzly.filterchain.TransportFilter; import org.glassfish.grizzly.nio.transport.TCPNIOTransport; import org.glassfish.grizzly.nio.transport.TCPNIOTransportBuilder; import org.glassfish.grizzly.utils.StringFilter;/*** Class initializes and starts the echo server, based on Grizzly 2.3*/ public class EchoServer {private static final Logger logger = Logger.getLogger(EchoServer.class.getName());public static final String HOST = "localhost";public static final int PORT = 7777;public static void main(String[] args) throws IOException {// Create a FilterChain using FilterChainBuilderFilterChainBuilder filterChainBuilder = FilterChainBuilder.stateless();// Add TransportFilter, which is responsible// for reading and writing data to the connectionfilterChainBuilder.add(new TransportFilter());// StringFilter is responsible for Buffer <-> String conversionfilterChainBuilder.add(new StringFilter(Charset.forName("UTF-8")));// EchoFilter is responsible for echoing received messagesfilterChainBuilder.add(new EchoFilter());// Create TCP transportfinal TCPNIOTransport transport =TCPNIOTransportBuilder.newInstance().build();transport.setProcessor(filterChainBuilder.build());try {// binding transport to start listen on certain host and porttransport.bind(HOST, PORT);// start the transporttransport.start();logger.info("Press any key to stop the server...");System.in.read();} finally {logger.info("Stopping transport...");// stop the transporttransport.shutdownNow();logger.info("Stopped transport...");}} }運(yùn)行回顯服務(wù)器(Echo Server)
正如我們?cè)谏厦娴拇a中看到的那樣,EchoServer類聲明了main方法,使用IDE運(yùn)行 main 方法。
客戶
創(chuàng)建客戶端過(guò)濾器
客戶端過(guò)濾器負(fù)責(zé)將服務(wù)器響應(yīng)重定向到標(biāo)準(zhǔn)輸出。請(qǐng)注意,ClientFilter要求FilterChainContext消息為java.lang.String(第21行),
因此它依賴于StringFilter在FilterChain中位于它之前。
客戶端初始化代碼
現(xiàn)在我們準(zhǔn)備初始化客戶端,包括FilterChain和Transport初始化。
Connection connection = null;// Create a FilterChain using FilterChainBuilder FilterChainBuilder filterChainBuilder = FilterChainBuilder.stateless();// Add TransportFilter, which is responsible // for reading and writing data to the connection filterChainBuilder.add(new TransportFilter());// StringFilter is responsible for Buffer <-> String conversion filterChainBuilder.add(new StringFilter(Charset.forName("UTF-8")));// ClientFilter is responsible for redirecting server responses to the standard output filterChainBuilder.add(new ClientFilter());// Create TCP transport final TCPNIOTransport transport =TCPNIOTransportBuilder.newInstance().build(); transport.setProcessor(filterChainBuilder.build());添加用戶交互和客戶端關(guān)閉代碼
讓我們通過(guò)添加邏輯來(lái)完成上面的代碼,該邏輯從標(biāo)準(zhǔn)輸入讀取用戶數(shù)據(jù),將其發(fā)送到服務(wù)器,并在輸入結(jié)束時(shí)執(zhí)行客戶端關(guān)閉。
package com.huyouxiao.loquat;import org.glassfish.grizzly.Connection;import org.glassfish.grizzly.Grizzly;import org.glassfish.grizzly.filterchain.FilterChainBuilder;import org.glassfish.grizzly.filterchain.TransportFilter;import org.glassfish.grizzly.nio.transport.TCPNIOTransport;import org.glassfish.grizzly.nio.transport.TCPNIOTransportBuilder;import org.glassfish.grizzly.utils.StringFilter;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.nio.charset.Charset;import java.util.concurrent.ExecutionException;import java.util.concurrent.Future;import java.util.concurrent.TimeUnit;import java.util.concurrent.TimeoutException;import java.util.logging.Logger;public class EchoClient {private static final Logger logger = Grizzly.logger(EchoClient.class);public static void main(String[] args) throws IOException,ExecutionException, InterruptedException, TimeoutException {Connection connection = null;// Create a FilterChain using FilterChainBuilderFilterChainBuilder filterChainBuilder = FilterChainBuilder.stateless();// Add TransportFilter, which is responsible// for reading and writing data to the connectionfilterChainBuilder.add(new TransportFilter());// StringFilter is responsible for Buffer <-> String conversionfilterChainBuilder.add(new StringFilter(Charset.forName("UTF-8")));// Client is responsible for redirecting server responses to the standard outputfilterChainBuilder.add(new ClientFilter());// Create TCP transportfinal TCPNIOTransport transport = TCPNIOTransportBuilder.newInstance().build();transport.setProcessor(filterChainBuilder.build());try {// Start the transporttransport.start();// perform async. connect to the serverFuture<Connection> future = transport.connect(EchoServer.HOST, EchoServer.PORT);// wait for connect operation to completeconnection = future.get(10, TimeUnit.SECONDS);assert connection != null;logger.info("Ready...(\"q\" to exit)");final BufferedReader inReader = new BufferedReader(new InputStreamReader(System.in));do {final String userInput = inReader.readLine();if (userInput == null || "q".equals(userInput)) {break;}connection.write(userInput);} while (true);} finally {// close the client connectionif (connection != null) {connection.close();}// stop the transporttransport.shutdownNow();}}}運(yùn)行回顯客戶端
用 IDE 運(yùn)行 EchoClient 的 main 方法。
或您最喜歡的IDE。
默認(rèn)情況下,如果標(biāo)準(zhǔn)輸入和輸出未更改-您將在控制臺(tái)上看到以下內(nèi)容:
現(xiàn)在客戶端已準(zhǔn)備好您的輸入。每次鍵入一行并按鍵-該行將被發(fā)送到服務(wù)器,并且響應(yīng)如下:
Ready... ("q" to exit) Hey there! Server echo: Hey there!代碼地址
總結(jié)
以上是生活随笔為你收集整理的Grizzly快速入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一个神奇的软件jide
- 下一篇: Latex基于longtable环境设置