jdk1.4 构建 java多线程,并发设计框架 使用列子(三)

  1. import java.io.*;
  2. import java.net.Socket;
  3. import java.io.BufferedInputStream;
  4. import java.io.ByteArrayOutputStream;
  5. import java.net.SocketException;
  6. //import java.nio.ByteBuffer;
  7. /**
  8.  * 获取相关数据流.
  9.  * 把读取的数据流,发送给处理数据流的对象ProcessRequestData.
  10.  * @author guishuanglin 2008-11-3
  11.  * 
  12.  */
  13. public class ProcessRequestStream implements Runnable {
  14.     //ByteArrayOutputStream
  15.     private ConcurrentQueue cQueue;
  16.     private String hostAddress;
  17.     private Socket socket;
  18.     private InputStream in;
  19.     private BufferedInputStream bufInput;
  20.     private ByteArrayOutputStream buffeData;
  21.     private int requestCount;
  22.     private byte b[];
  23.     private byte end[];
  24.     private int len;
  25.     private int maxBuffer = 1024;
  26.     /**
  27.      * @param ss
  28.      * @param requestNum
  29.      */
  30.     public ProcessRequestStream(Socket st,int requestCount,int cacheByte,ConcurrentQueue cQueue) {
  31.         socket = st;
  32.         this.cQueue = cQueue;
  33.         this.maxBuffer = cacheByte;
  34.         this.requestCount= requestCount;
  35.         end = new byte[]{101110100};
  36.         b   = new byte[1024];
  37.         System.out.println("Request["+requestCount+"],buffer byte: "+cacheByte);
  38.         try {
  39.             //连接超时设置30s
  40.             socket.setSoTimeout(30000);
  41.             in = socket.getInputStream();
  42.             bufInput = new BufferedInputStream(in);
  43.             hostAddress  = socket.getInetAddress().getHostAddress();
  44.         } catch (IOException ie) {
  45.             System.out.println("Request["+requestCount+"],读取客户端[" + hostAddress + "]的输入流失败.");
  46.             ReleaseResource();
  47.             ie.printStackTrace();
  48.             System.exit(0);
  49.         }
  50.     }
  51.     public void run() {
  52.         bufferStreamData();
  53.     }
  54.     /**
  55.      * @date 2008-11-5
  56.      */
  57.     public void bufferStreamData() {
  58.         // 读取输入流,如果由于流末尾已到达而不再有数据,则返回 -1,表示对方已经关闭.
  59.         try{
  60.             //第一次读数据
  61.             len = bufInput.read(b);
  62.             if(len != -1){
  63.                 this.newOutputStream();
  64.                 buffeData.write(b, 0, len);
  65.                 while ((len = bufInput.read(b)) != -1) {
  66.                     if(buffeData.size() < this.maxBuffer){
  67.                         buffeData.write(b, 0, len);
  68.                     }else{
  69.                         newOutputStream();
  70.                         buffeData.write(b, 0, len);
  71.                     }
  72.                 }
  73.             }
  74.             bufInput.close();
  75.             in.close();
  76.             socket.close();
  77.         } catch (SocketException se) {
  78.             se.printStackTrace();
  79.         } catch (IOException io) {
  80.             io.printStackTrace();
  81.         } finally {
  82.             //流的结束处加上完成读的3字节的end单独标志.
  83.             newOutputStream();
  84.             buffeData.write(end, 0, end.length);
  85.             cQueue.enQueue(buffeData);
  86.             System.out.println("Request["+requestCount+"],读取流数据完成.");
  87.             ReleaseResource();
  88.         }
  89.     }
  90.     
  91.     public void newOutputStream(){
  92.         if(buffeData != null && buffeData.size()>0){
  93.             //int i = cQueue.size()+1;
  94.             cQueue.enQueue(buffeData);
  95.             //System.out.println("Request["+requestCount+"],add buffer queue,current size: "+i);
  96.         }
  97.         buffeData = null;
  98.         buffeData = new ByteArrayOutputStream();
  99.     }
  100.     
  101.     public void ReleaseResource() {
  102.         try {
  103.             buffeData =null;
  104.             bufInput  =null;
  105.             if(in!=null)
  106.                 in.close();
  107.             in=null;
  108.             if(socket!=null)
  109.                 socket.close();
  110.             socket=null;
  111.             b=null;
  112.             end=null;
  113.             System.out.println("Request["+requestCount+"],客户端[" + hostAddress + "]会话socket已断开.");
  114.             hostAddress=null;
  115.             cQueue   = null;
  116.         } catch (IOException e) {
  117.             e.printStackTrace();
  118.         }
  119.     }
  120. }
 接到 Socket流后,处理流数据,把数据放入并发队列中。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值