日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

vaniglia 源码学习 (六)

發布時間:2025/3/15 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vaniglia 源码学习 (六) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

學習vaniglia源碼中的socket部分,主要針對其server側的代碼實現做個記錄。其代碼有兩部分值得學習,一塊是實現了一個經典的線程池,另外一個是利用代理接口擴展業務的具體socket消息處理。

socket的server主要由三個部分組成:

  • ServerDelegate接口,提供readRequest、writeResult接口。由用戶擴展并注冊到SocketReceiver中;
  • SocketReceiver類,socket server的工作線程;
  • SocketServer類,初始化一個SocketReceiver的線程池,當accept返回時,喚醒空閑的SocketReceiver執行。

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);//該函數中SocketReceiver線程被startreceiversPool.addElement(receiver);//receiversPool是一個vector變量;receivers[i] = receiver;}

二是在accept返回時選擇ready的線程執行,如下:

SocketReceiver receiver = (SocketReceiver)receiversPool.get(receiverIndex);//receiverIndex是外側循環的變量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沒有調用時該線程wait中。try {wait();} catch (InterruptedException e) { e.printStackTrace();}}}System.out.println("Receive run, service handler");//這部分的代碼在在socket里就是處理input和output,實現時調用業務的代理接口。 ready = true;synchronized(this) {notify();}}}public synchronized void handler(){//有業務出發時,handler被調用while(ready == false){try {wait();} catch (InterruptedException e) { e.printStackTrace();}}ready = false;notify();} }

?

轉載于:https://www.cnblogs.com/Fredric-2013/archive/2013/04/06/3002951.html

總結

以上是生活随笔為你收集整理的vaniglia 源码学习 (六)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。