- import java.io.*;
- import java.net.Socket;
- import java.io.BufferedInputStream;
- import java.io.ByteArrayOutputStream;
- import java.net.SocketException;
- //import java.nio.ByteBuffer;
- /**
- * 获取相关数据流.
- * 把读取的数据流,发送给处理数据流的对象ProcessRequestData.
- * @author guishuanglin 2008-11-3
- *
- */
- public class ProcessRequestStream implements Runnable {
- //ByteArrayOutputStream
- private ConcurrentQueue cQueue;
- private String hostAddress;
- private Socket socket;
- private InputStream in;
- private BufferedInputStream bufInput;
- private ByteArrayOutputStream buffeData;
- private int requestCount;
- private byte b[];
- private byte end[];
- private int len;
- private int maxBuffer = 1024;
- /**
- * @param ss
- * @param requestNum
- */
- public ProcessRequestStream(Socket st,int requestCount,int cacheByte,ConcurrentQueue cQueue) {
- socket = st;
- this.cQueue = cQueue;
- this.maxBuffer = cacheByte;
- this.requestCount= requestCount;
- end = new byte[]{101, 110, 100};
- b = new byte[1024];
- System.out.println("Request["+requestCount+"],buffer byte: "+cacheByte);
- try {
- //连接超时设置30s
- socket.setSoTimeout(30000);
- in = socket.getInputStream();
- bufInput = new BufferedInputStream(in);
- hostAddress = socket.getInetAddress().getHostAddress();
- } catch (IOException ie) {
- System.out.println("Request["+requestCount+"],读取客户端[" + hostAddress + "]的输入流失败.");
- ReleaseResource();
- ie.printStackTrace();
- System.exit(0);
- }
- }
- public void run() {
- bufferStreamData();
- }
- /**
- * @date 2008-11-5
- */
- public void bufferStreamData() {
- // 读取输入流,如果由于流末尾已到达而不再有数据,则返回 -1,表示对方已经关闭.
- try{
- //第一次读数据
- len = bufInput.read(b);
- if(len != -1){
- this.newOutputStream();
- buffeData.write(b, 0, len);
- while ((len = bufInput.read(b)) != -1) {
- if(buffeData.size() < this.maxBuffer){
- buffeData.write(b, 0, len);
- }else{
- newOutputStream();
- buffeData.write(b, 0, len);
- }
- }
- }
- bufInput.close();
- in.close();
- socket.close();
- } catch (SocketException se) {
- se.printStackTrace();
- } catch (IOException io) {
- io.printStackTrace();
- } finally {
- //流的结束处加上完成读的3字节的end单独标志.
- newOutputStream();
- buffeData.write(end, 0, end.length);
- cQueue.enQueue(buffeData);
- System.out.println("Request["+requestCount+"],读取流数据完成.");
- ReleaseResource();
- }
- }
- public void newOutputStream(){
- if(buffeData != null && buffeData.size()>0){
- //int i = cQueue.size()+1;
- cQueue.enQueue(buffeData);
- //System.out.println("Request["+requestCount+"],add buffer queue,current size: "+i);
- }
- buffeData = null;
- buffeData = new ByteArrayOutputStream();
- }
- public void ReleaseResource() {
- try {
- buffeData =null;
- bufInput =null;
- if(in!=null)
- in.close();
- in=null;
- if(socket!=null)
- socket.close();
- socket=null;
- b=null;
- end=null;
- System.out.println("Request["+requestCount+"],客户端[" + hostAddress + "]会话socket已断开.");
- hostAddress=null;
- cQueue = null;
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
jdk1.4 构建 java多线程,并发设计框架 使用列子(三)
最新推荐文章于 2022-07-23 16:19:40 发布