博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jdk1.4 构建 java多线程,并发设计框架 使用列子(六)
阅读量:2794 次
发布时间:2019-05-13

本文共 2818 字,大约阅读时间需要 9 分钟。

java 多线程,,Socket,网络,流,并发,框架,已经讲完。
 一个客户端实现的代码:
  1. import java.io.*;
  2. import java.nio.ByteBuffer;
  3. import org.apache.commons.logging.Log;
  4. import org.apache.commons.logging.LogFactory;
  5. import com.willfar.commons.net.ConcurrentQueue;
  6. import com.willfar.commons.net.IProcessClientData;
  7. import com.willfar.shantou.engine.protocol.ScadaIfcValidate;
  8. /**
  9.  * 处理客户端的服务请求,ClientStream
  10.  * ByteArrayOutputStream
  11.  * @author guishuanglin 2008-11-3
  12.  * 
  13.  */
  14. public class ProcessClientDataImpl implements
  15.         IProcessClientData {
  16.     private Log logger = LogFactory.getLog(ProcessClientDataImpl.class);
  17.     //ByteArrayOutputStream
  18.     private ConcurrentQueue dataQueue;
  19.     private ByteArrayOutputStream streamData;
  20.     private ByteArrayOutputStream tempStream;
  21.     private ByteBuffer buf;
  22.     private int requestCount;
  23.     private String netAddress;
  24.     private ScadaIfcValidate sv;
  25.     public void run() {
  26.         try {
  27.             String s = "";
  28.             boolean bool = true;
  29.             sv = new ScadaIfcValidate();
  30.             tempStream = new ByteArrayOutputStream();
  31.             while (bool) {
  32.                 streamData = (ByteArrayOutputStream)dataQueue.deQueue();
  33.                 if (streamData != null) {
  34.                     int ll = streamData.size();
  35.                     if (ll == 3) {
  36.                         s = streamData.toString();
  37.                         if ("end".equals(s)) {
  38.                             logger.info("[" + requestCount + "],客户端发送数据结束.");
  39.                             bool = false;
  40.                             continue;
  41.                         }
  42.                     }
  43.                     //数据太短,暂时保存
  44.                     streamData.writeTo(tempStream);
  45.                     ll = tempStream.size();
  46.                     if (ll < 3){
  47.                         continue;
  48.                     }
  49.                     byte[] b = tempStream.toByteArray();
  50.                     //验证数据是否完整,正确.
  51.                     boolean bol = sv.isValid(b);
  52.                     if (bol) {
  53.                         logger.info("[" + requestCount + "],收到客户端[" 
  54.                                 + netAddress+ "]数据,长度: " + tempStream.size() 
  55.                                 + " 字节,Fn内容:["+ sv.getFn() + "]");
  56.                         new Thread(new ProcessAcceptData(b)).start();
  57.                     }else{
  58.                         //数据长度不够,等下一包数据
  59.                         if(sv.getRemaining()>0){
  60.                             logger.info("数据总长: "+sv.getAllLength()+" 字节,收到: "
  61.                                     + sv.getCurLength()+" 字节,等下一包数据...");
  62.                             continue;
  63.                         }else{
  64.                             logger.info("[" + requestCount + "],收到客户端[" + netAddress
  65.                                     + "]数据,长度: " + tempStream.size() + " 字节,内容:[数据不完整]");
  66.                             //无用数据清除
  67.                             this.getStringByByte(tempStream);
  68.                             tempStream.reset();
  69.                             tempStream.close();
  70.                             
  71.                         }
  72.                     }               
  73.                     try {
  74.                         streamData.reset();
  75.                         streamData.close();
  76.                     } catch (IOException e) {
  77.                         e.printStackTrace();
  78.                     }
  79.                 }
  80.             }
  81.         } catch (IOException e1) {
  82.             e1.printStackTrace();
  83.         } finally {
  84.             try {
  85.                 dataQueue.clear();
  86.                 dataQueue = null;
  87.                 tempStream.reset();
  88.                 tempStream.close();
  89.                 tempStream= null;
  90.                 streamData.reset();
  91.                 streamData.close();
  92.                 streamData=null;
  93.                 logger = null;
  94.                 sv =null;
  95.             } catch (IOException e) {
  96.                 e.printStackTrace();
  97.             }
  98.         }
  99.     }
  100.     //ConcurrentQueue<ByteArrayOutputStream>
  101.     public void ProcessStreamData(ConcurrentQueue dataQueue, int requestCount, String netAddress) {
  102.         this.dataQueue = dataQueue;
  103.         this.requestCount = requestCount;
  104.         this.netAddress = netAddress;
  105.     }
  106.     
  107.     public void getStringByByte(ByteArrayOutputStream tempStream){
  108.         //输出内容
  109.         if(tempStream!=null){
  110.             StringBuffer bf = new StringBuffer();
  111.             byte[] b = tempStream.toByteArray();
  112.             for(int i=0;i<b.length;i++){
  113.                 bf.append(b[i]);
  114.             }
  115.             logger.info(bf.toString());
  116.             bf = null;
  117.             b  = null;
  118.         }
  119.     }
  120. }

转载地址:http://jcnmd.baihongyu.com/

你可能感兴趣的文章
在线工具
查看>>
Mybatis报错----result Map
查看>>
互联网服务端技术——如何学(下A)
查看>>
游戏行业随想
查看>>
理解TCP/IP网络栈&编写网络应用(下)
查看>>
【败局】成都:手游第四城的泡沫与坍缩
查看>>
深入boost的asio框架
查看>>
BOOST enable_shared_from_this
查看>>
STL容器
查看>>
开源社区
查看>>
程序员编程生涯中会犯的7个错误
查看>>
你不知道的关于计算机大师Dijkstra的事情
查看>>
TrinityCore中的PreparedStatement
查看>>
分清成员函数,非成员函数和友元函数
查看>>
端游、手游服务端常用的架构是什么样的?
查看>>
游戏服务端究竟解决了什么问题?
查看>>
mongodb集合中查询文档
查看>>
关联规则挖掘——Apriori算法的基本原理以及改进
查看>>
决策树之ID3算法
查看>>
朴素贝叶斯算法
查看>>