Grizzly開發Echo服務器實戰
用 Java編寫可伸縮的服務器應用是有難度的,用Java NIO開發、線程管理、為成千上萬的用戶做服務器擴展,這些都是難點。Grizzly NIO框架的設計目標就是幫助開發者很好地利用Java NIO API,編寫出高可擴展性的、功能強大的服務器,并提高了擴展的框架組件:Web Framework(HTTP/S)、WebSocket、Comet等。
Grizzly 2.3開發Echo服務器/客戶端的例子
1、下載grizzly-framework.jar庫
Maven依賴
<dependency>
<groupId>org.glassfish.grizzly</groupId>
<artifactId>grizzly-framework</artifactId>
<version>2.3.16</version>
</dependency>或下載地址: http://central.maven.org/maven2/org/glassfish/grizzly/grizzly-framework/2.3.16/grizzly-framework-2.3.16.jar
2014.10.23日剛發布了2.3.17版,地址見:
https://maven.java.net/content/repositories/releases/org/glassfish/grizzly/grizzly-framework/2.3.17/grizzly-framework-2.3.17.jar
也可以用這個版本。
服務器端:
1)創建Echo過濾器
Echo過濾器負責把接收到的消息(不管其類型)原樣返回給Grizzly連接。
2)服務器初始化代碼
所有的服務器過濾器鏈都準備好,開始初始化并啟動服務器。
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創建過濾器鏈
FilterChainBuilder filterChainBuilder = FilterChainBuilder.stateless();
// 添加TransportFilter,它負責從連接中讀數據,并寫數據到連接
filterChainBuilder.add(new TransportFilter());
// 字符串過濾器StringFilter負責緩沖和字符串之間的轉換
filterChainBuilder.add(new StringFilter(Charset.forName("UTF-8")));
// 過濾器EchoFilter負責把接收到的消息原樣返回給連接
filterChainBuilder.add(new EchoFilter());
// 創建TCP傳輸
final TCPNIOTransport transport = TCPNIOTransportBuilder.newInstance().build();
transport.setProcessor(filterChainBuilder.build());
try{
// 綁定傳輸,開始對主機+端口進行監聽
transport.bind(HOST, PORT);
// 開始傳輸
transport.start();
logger.info("Press any key to stop the Echo server...");
System.in.read();
} finally{
logger.info("Stopping transport...");
// 停止傳輸服務器
transport.shutdown();
logger.info("Stopped transport...");
}
}
} 運行Echo服務器:
- java -classpath grizzly-framework.jar EchoServer
客戶端:
1)創建客戶端過濾器
客戶端過濾器負責重定向服務器的響應到標準輸出。要注意,客戶端過濾器需要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{
/**
* 僅處理讀操作,當消息到來時進行處理
* @param ctx 處理的上下文
* @return 下一個動作
*/
@Override
public NextAction handleRead(final FilterChainContext ctx) throws IOException{
// 從上下文得到字符串消息,過濾器鏈只使用了字符串過濾器StringFilter
final String serverResponse = ctx.getMessage();
System.out.println("Server echo: " + serverResponse);
return ctx.getStopAction();
}
} 2)客戶端代碼
簡單的客戶端,向Echo服務器發送消息并等待響應。
運行Echo客戶端:
- java -classpath grizzly-framework.jar EchoClient
已經通過測試,程序運行的非常完美。
作者:chszs,轉載需注明。博客主頁:http://blog.csdn.net/chszs
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!