當(dāng)前位置:
首頁 >
Grizzly开发Echo服务器实战
發(fā)布時(shí)間:2024/3/24
65
豆豆
生活随笔
收集整理的這篇文章主要介紹了
Grizzly开发Echo服务器实战
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Grizzly開發(fā)Echo服務(wù)器實(shí)戰(zhàn)
作者:chszs,轉(zhuǎn)載需注明。博客主頁:http://blog.csdn.net/chszs
用Java編寫可伸縮的服務(wù)器應(yīng)用是有難度的,用Java NIO開發(fā)、線程管理、為成千上萬的用戶做服務(wù)器擴(kuò)展,這些都是難點(diǎn)。Grizzly NIO框架的設(shè)計(jì)目標(biāo)就是幫助開發(fā)者很好地利用Java NIO API,編寫出高可擴(kuò)展性的、功能強(qiáng)大的服務(wù)器,并提高了擴(kuò)展的框架組件:Web Framework(HTTP/S)、WebSocket、Comet等。
Grizzly 2.3開發(fā)Echo服務(wù)器/客戶端的例子
1、下載grizzly-framework.jar庫
Maven依賴
或下載地址: http://central.maven.org/maven2/org/glassfish/grizzly/grizzly-framework/2.3.16/grizzly-framework-2.3.16.jar
2014.10.23日剛發(fā)布了2.3.17版,地址見:?
https://maven.java.net/content/repositories/releases/org/glassfish/grizzly/grizzly-framework/2.3.17/grizzly-framework-2.3.17.jar
也可以用這個(gè)版本。
服務(wù)器端:
1)創(chuàng)建Echo過濾器
Echo過濾器負(fù)責(zé)把接收到的消息(不管其類型)原樣返回給Grizzly連接。
import java.io.IOException;import org.glassfish.grizzly.filterchain.BaseFilter; import org.glassfish.grizzly.filterchain.FilterChainContext; import org.glassfish.grizzly.filterchain.NextAction;public class EchoFilter extends BaseFilter{/*** 僅處理讀操作,當(dāng)消息到來時(shí)進(jìn)行處理* @param ctx 處理的上下文* @return 下一個(gè)動(dòng)作*/@Overridepublic NextAction handleRead(FilterChainContext ctx) throws IOException{// Peer address用于無連接的UDP連接final Object peerAddress = ctx.getAddress();final Object message = ctx.getMessage();System.out.println("Server received: " + message);ctx.write(peerAddress, message, null);return ctx.getStopAction();} }
2)服務(wù)器初始化代碼
所有的服務(wù)器過濾器鏈都準(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;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{// 用FilterChainBuilder創(chuàng)建過濾器鏈FilterChainBuilder filterChainBuilder = FilterChainBuilder.stateless();// 添加TransportFilter,它負(fù)責(zé)從連接中讀數(shù)據(jù),并寫數(shù)據(jù)到連接filterChainBuilder.add(new TransportFilter());// 字符串過濾器StringFilter負(fù)責(zé)緩沖和字符串之間的轉(zhuǎn)換filterChainBuilder.add(new StringFilter(Charset.forName("UTF-8")));// 過濾器EchoFilter負(fù)責(zé)把接收到的消息原樣返回給連接filterChainBuilder.add(new EchoFilter());// 創(chuàng)建TCP傳輸final TCPNIOTransport transport = TCPNIOTransportBuilder.newInstance().build();transport.setProcessor(filterChainBuilder.build());try{// 綁定傳輸,開始對(duì)主機(jī)+端口進(jìn)行監(jiān)聽transport.bind(HOST, PORT);// 開始傳輸transport.start();logger.info("Press any key to stop the Echo server...");System.in.read();} finally{logger.info("Stopping transport...");// 停止傳輸服務(wù)器transport.shutdown();logger.info("Stopped transport...");}} }
運(yùn)行Echo服務(wù)器:
java -classpath grizzly-framework.jar EchoServer
客戶端:
1)創(chuàng)建客戶端過濾器
客戶端過濾器負(fù)責(zé)重定向服務(wù)器的響應(yīng)到標(biāo)準(zhǔn)輸出。要注意,客戶端過濾器需要FilterChainContext消息
import java.io.IOException;import org.glassfish.grizzly.filterchain.BaseFilter; import org.glassfish.grizzly.filterchain.FilterChainContext; import org.glassfish.grizzly.filterchain.NextAction;public class ClientFilter extends BaseFilter{/*** 僅處理讀操作,當(dāng)消息到來時(shí)進(jìn)行處理* @param ctx 處理的上下文* @return 下一個(gè)動(dòng)作*/@Overridepublic NextAction handleRead(final FilterChainContext ctx) throws IOException{// 從上下文得到字符串消息,過濾器鏈只使用了字符串過濾器StringFilterfinal String serverResponse = ctx.getMessage();System.out.println("Server echo: " + serverResponse);return ctx.getStopAction();} }
2)客戶端代碼
簡單的客戶端,向Echo服務(wù)器發(fā)送消息并等待響應(yīng)。
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;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 ch.echo.server.EchoServer;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;// 用FilterChainBuilder類創(chuàng)建過濾器鏈FilterChainBuilder filterChainBuilder = FilterChainBuilder.stateless();// 添加傳輸過濾器,它負(fù)責(zé)從連接讀數(shù)據(jù)并向連接寫數(shù)據(jù)filterChainBuilder.add(new TransportFilter());// 添加字符串過濾器,它負(fù)責(zé)緩沖和字符串之間的轉(zhuǎn)換filterChainBuilder.add(new StringFilter(Charset.forName("UTF-8")));// 添加客戶端過濾器,他負(fù)責(zé)把服務(wù)器響應(yīng)重定向到標(biāo)準(zhǔn)輸出filterChainBuilder.add(new ClientFilter());// 創(chuàng)建TCP傳輸final TCPNIOTransport transport = TCPNIOTransportBuilder.newInstance().build();transport.setProcessor(filterChainBuilder.build());try{// 啟動(dòng)傳輸transport.start();// 異步執(zhí)行,連接到服務(wù)器Future<Connection> future = transport.connect(EchoServer.HOST, EchoServer.PORT);// 等待連接操作的完成connection = future.get(10, TimeUnit.SECONDS);assert connection!=null;System.out.println("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{// 關(guān)閉客戶端連接if(connection!=null)connection.close();// 停止傳輸transport.shutdownNow();}} }
運(yùn)行Echo客戶端:
java -classpath grizzly-framework.jar EchoClient
已經(jīng)通過測試,程序運(yùn)行的非常完美。
總結(jié)
以上是生活随笔為你收集整理的Grizzly开发Echo服务器实战的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 加入昇思MindFlow SIG,助力A
- 下一篇: Acunetix WVS 11安装及漏洞