Grizzly快速入门
Grizzly框架組件
使用 Java?編程語言編寫可擴展的服務器應用程序一直很困難。在 Java 新 I/O API (NIO) 出現之前,線程管理問題使服務器無法擴展到數千個用戶。
Grizzly NIO 框架旨在幫助開發人員利用 Java? NIO API。Grizzly 的目標是幫助開發人員使用 NIO 構建可擴展和強大的服務器,
并提供擴展的框架組件:Web 框架 (HTTP/S)、WebSocket、Comet等!
快速開始
本章將介紹客戶端和服務器端如何開始使用Grizzly 2.3。
首先,有必要依靠正確的Grizzly 2.4 核心版本。
Maven開發人員將需要向pom添加以下依賴項:
所有的Grizzly Maven工件都部署在Maven Central存儲庫中。
讓我們實現簡單的Echo客戶端-服務器應用程序。客戶端將從標準輸入中獲取用戶數據,將數據發送到Echo服務器,并將服務器的響應重定向到標準輸出。Echo服務器的職責是從網絡通道讀取數據,并將相同的數據回顯到通道。
服務器
創建回聲過濾器(Echo filter)
首先,讓我們實現回聲過濾器(echo filter),該過濾器會將收到的消息(不考慮其類型)回顯到 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();} }服務器初始化代碼
服務器的所有FilterChain塊都已準備好-讓我們初始化并啟動服務器。
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...");}} }運行回顯服務器(Echo Server)
正如我們在上面的代碼中看到的那樣,EchoServer類聲明了main方法,使用IDE運行 main 方法。
客戶
創建客戶端過濾器
客戶端過濾器負責將服務器響應重定向到標準輸出。請注意,ClientFilter要求FilterChainContext消息為java.lang.String(第21行),
因此它依賴于StringFilter在FilterChain中位于它之前。
客戶端初始化代碼
現在我們準備初始化客戶端,包括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());添加用戶交互和客戶端關閉代碼
讓我們通過添加邏輯來完成上面的代碼,該邏輯從標準輸入讀取用戶數據,將其發送到服務器,并在輸入結束時執行客戶端關閉。
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();}}}運行回顯客戶端
用 IDE 運行 EchoClient 的 main 方法。
或您最喜歡的IDE。
默認情況下,如果標準輸入和輸出未更改-您將在控制臺上看到以下內容:
現在客戶端已準備好您的輸入。每次鍵入一行并按鍵-該行將被發送到服務器,并且響應如下:
Ready... ("q" to exit) Hey there! Server echo: Hey there!代碼地址
總結
以上是生活随笔為你收集整理的Grizzly快速入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个神奇的软件jide
- 下一篇: Latex基于longtable环境设置