vaniglia 源码学习 (六)
生活随笔
收集整理的這篇文章主要介紹了
vaniglia 源码学习 (六)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
學(xué)習(xí)vaniglia源碼中的socket部分,主要針對其server側(cè)的代碼實現(xiàn)做個記錄。其代碼有兩部分值得學(xué)習(xí),一塊是實現(xiàn)了一個經(jīng)典的線程池,另外一個是利用代理接口擴展業(yè)務(wù)的具體socket消息處理。
socket的server主要由三個部分組成:
- ServerDelegate接口,提供readRequest、writeResult接口。由用戶擴展并注冊到SocketReceiver中;
- SocketReceiver類,socket server的工作線程;
- SocketServer類,初始化一個SocketReceiver的線程池,當accept返回時,喚醒空閑的SocketReceiver執(zhí)行。
SocketServer核心代碼主要是兩個部分:
一是初始化線程池:
SocketReceiver[] receivers = new SocketReceiver[numOfThreads];for (int i = 0; i < numOfThreads; i++) {ServerDelegate delegate = null;try {delegate = (ServerDelegate)serverDelegateClass.newInstance();} catch (InstantiationException e) { //略}SocketReceiver receiver = SocketReceiver.createSocketReceiver(delegate);//該函數(shù)中SocketReceiver線程被startreceiversPool.addElement(receiver);//receiversPool是一個vector變量;receivers[i] = receiver;}二是在accept返回時選擇ready的線程執(zhí)行,如下:
SocketReceiver receiver = (SocketReceiver)receiversPool.get(receiverIndex);//receiverIndex是外側(cè)循環(huán)的變量receiverIndex = (receiverIndex + 1) % receiversPoolSize;//通過index遍歷vectorif (receiver.isReady()) {handling = true;if (clientSocketSoTimeout > 0) {logger.debug("Setting client socket SoTimeout to "+clientSocketSoTimeout+"ms");try {clientSocket.setSoTimeout(clientSocketSoTimeout);} catch (SocketException e) {logger.error("Exception while setting SoTimeout for client socket", e);}}clientSocket.setTcpNoDelay(true);receiver.handle(clientSocket);//一個工作線程被喚醒}SocketReceiver的核心代碼是典型的工作線程,我將它簡化成一個框架版本,如下:
public class Receive implements Runnable {private boolean ready; Receive(){ready = true;}static Receive start(){Receive rev = new Receive();Thread t = new Thread(rev);t.start();return rev;}@Overridepublic void run() {while(true){synchronized(this){while(true == ready){//當handler沒有調(diào)用時該線程wait中。try {wait();} catch (InterruptedException e) { e.printStackTrace();}}}System.out.println("Receive run, service handler");//這部分的代碼在在socket里就是處理input和output,實現(xiàn)時調(diào)用業(yè)務(wù)的代理接口。 ready = true;synchronized(this) {notify();}}}public synchronized void handler(){//有業(yè)務(wù)出發(fā)時,handler被調(diào)用while(ready == false){try {wait();} catch (InterruptedException e) { e.printStackTrace();}}ready = false;notify();} }?
轉(zhuǎn)載于:https://www.cnblogs.com/Fredric-2013/archive/2013/04/06/3002951.html
總結(jié)
以上是生活随笔為你收集整理的vaniglia 源码学习 (六)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黑客主要攻击方式
- 下一篇: 算法题5 用数组实现队列