亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tcpclientimpl.java

?? 同步接收web services請求
?? JAVA
字號:
package com.aceway.vas.commons.tcp.impl;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ClosedChannelException;
import java.nio.channels.ClosedSelectorException;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import org.apache.log4j.Logger;

import com.aceway.vas.commons.tcp.IClientHandler;
import com.aceway.vas.commons.tcp.TcpClient;
import com.aceway.vas.commons.tcp.common.TypeConvert;

public class TcpClientImpl implements TcpClient {

	static Logger log = Logger.getLogger(TcpClientImpl.class);

	private SocketChannel sc = null;

	// 包的最大尺寸
	private int maxPacketSize = 1024;

	// 接收線程的運行標志
	private boolean val = true;

	// 回調函數
	private IClientHandler handler = null;

	// 接收緩沖
	private ByteBuffer recvBuff = null;

	// 接收進程
	static RecvThread rt = null;
	
	/**
	 * TCP線路維護線程 
	 */
	//static 

	// 存儲當前的實例
	static List objs = new ArrayList();

	private SocketChannel getSocketChannel() {
		return this.sc;
	}

	private IClientHandler getClientHandler() {
		return this.handler;
	}

	private int getMaxPackageSize() {
		return this.maxPacketSize;
	}

	public boolean connect(String ip, int port) {
		try {
			InetSocketAddress addr = new InetSocketAddress(ip, port);
			// 生成一個socketchannel
			sc = SocketChannel.open(addr);
			// 連接到server
			sc.configureBlocking(false);
			// 存儲所有的連接
			this.objs.add(this);
			// 添加TcpClientImpl的實例到接收線程
			rt.add(this);
			// 響應連接事件
			handler.onConnect(ip, port);
			return true;
		}catch(Exception e){
			log.error("連接錯誤, 可能遠程的服務器已經關閉",e);
			return false;
		}
	}

	public boolean disconnect() {
		try {
			this.sc.close();
		} catch (Exception ex) {
			ex.printStackTrace();
			return false;
		}
		if (objs.contains(this)) {
			objs.remove(this);
		}

		handler.onDisconnect();
		return true;

	}

	public synchronized int send(byte[] bytes) {
		try {
			ByteBuffer bb = ByteBuffer.wrap(bytes);
			while (bb.hasRemaining())
				sc.write(bb);
			// 如果是消息的話
			if (TypeConvert.byte2int(bytes, 0) != 1)
				handler.onSendedMsg(bytes);
			else {
				// 否則如果是OBJECT的話
				byte[] temp = new byte[bytes.length - 8];
				System.arraycopy(bytes, 8, temp, 0, temp.length);
				ByteArrayInputStream byteIn = new ByteArrayInputStream(temp);
				ObjectInputStream in = new ObjectInputStream(byteIn);
				Object o = in.readObject();
				handler.onSendedMsg((Serializable) o);
			}
			return 0;
		} catch (Exception ex) {
			ex.printStackTrace();
			try {
	            sc.close();
            } catch (IOException e) {
	            e.printStackTrace();
            }
			return 1;
		}
	}

	// 從服務器端獲取信息
	private class RecvThread extends Thread {
		Selector selector = null;

		//存放所有的TcpClientImpl實例
		List list = new ArrayList();

		public RecvThread() {
			try {
				selector = Selector.open();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		public void add(TcpClientImpl client) {
			synchronized (list) {
				list.add(client);
				list.notifyAll();
				selector.wakeup();
			}

		}
		
		private void sliceAndDealWithData(TcpClientImpl ci, IClientHandler dh) {
			ByteBuffer buff = ci.recvBuff;

			int dataLen = buff.position();
			
			int  iPos = 0;	// 每次切包開始位置
			
			while (dataLen - iPos > 4) {
				buff.position(iPos);
				
				if (buff.getInt(iPos) == 1) {		// object
					if (dataLen - iPos > 8){
						int packageSize = buff.getInt(iPos + 4);
						if (packageSize > maxPacketSize){
							buff.clear();
							return;
						}
						if (dataLen - iPos - 8 >= packageSize ) {		// 如果buffer里有一個完整的包
							
							buff.position(iPos + 8);
							byte[] byteObj = new byte[packageSize];
							buff.get(byteObj, 0, packageSize); // 將消息存放入byteObj里

							/* ================還原對象=========開始======== */
							ByteArrayInputStream byteIn = new ByteArrayInputStream(
							        byteObj);
							ObjectInputStream in = null;
							Object o = null;
							try {
								in = new ObjectInputStream(byteIn);
								o = in.readObject();
							} catch (IOException e) {
								log.error("接收對象的時候發生錯誤");
								e.printStackTrace();
								break;
							} catch (ClassNotFoundException e) {
								log.error("接收對象的時候發生錯誤, 對象沒有找到");
								e.printStackTrace();
								break;
							}
							dh.onReceiveMsg(
							        (Serializable) o);
							/* ================還原對象=========結束======== */
							
							iPos  += 8 + packageSize;
							continue;
						}	// if (dataLen - iPos > 8)
					}

					// not enough for one package
					break;
				} else 	{		// byte stream
					byte[] msg = new byte[dataLen - iPos];
					buff.get(msg, 0, dataLen - iPos); // 從buffer里取得當前的消息體
					int sliceResult = dh.slice(msg);
					if (sliceResult > 0) { // 當可以切到一個完整的包的時候
						byte[] msgPkt = new byte[sliceResult];
						System.arraycopy(msg, 0, msgPkt, 0, sliceResult);	// 獲得當前一個完整的包
						dh.onReceiveMsg(msgPkt);			//回調
						
						iPos += sliceResult;
					}
				}
			}
				// 處理切包剩余部分
				if (dataLen - iPos > 0)	{// remaining
					buff.position(iPos);
					buff.limit(dataLen);
					buff.compact();
				} else {
					buff.clear();
				}

		}

		public void run() {
			int n = 0, read;
			while (val) {
				// try {
				//判斷list里有沒有TcpClientImpl實例, 如果有的話, 注冊到接收線程的selector里
				while (list.size() > 0) {
					TcpClientImpl client = (TcpClientImpl) list.remove(list
							.size() - 1);
					SocketChannel sc = client.getSocketChannel();
					try {
						sc.register(selector, SelectionKey.OP_READ, client);
					} catch (ClosedChannelException e) {
						e.printStackTrace();
						break;
					}
				}
				try {
					n = selector.select();
				} catch (IOException e) {
					n = 0;
					val = false;
					e.printStackTrace();
				} catch(ClosedSelectorException e){
					n = 0;
					val = false;
					e.printStackTrace();
				}
				if (n > 0) {
					Set set = selector.selectedKeys();
					java.util.Iterator it = set.iterator();
					while (it.hasNext()) {
						SelectionKey skey = (SelectionKey) it.next();
						it.remove();
						try {
							if (skey.isReadable()) {
								SocketChannel sc = (SocketChannel) skey
										.channel();
								TcpClientImpl temp = (TcpClientImpl) skey
										.attachment();
								IClientHandler ch = temp.getClientHandler();
								ByteBuffer buffer = temp.recvBuff;
								buffer.limit(buffer.capacity());

								while ((read = sc.read(buffer)) != -1) {
									if (read == 0)
										break;

									//buffer.flip();
									sliceAndDealWithData(temp, ch);
								}
							}
						} catch (java.nio.channels.CancelledKeyException ex) {
							try {
								skey.channel().close();
							} catch (IOException e) {
								e.printStackTrace();
							}
							objs.remove((TcpClientImpl) skey.attachment());
							((TcpClientImpl) skey.attachment()).disconnect();
						} catch (ClosedSelectorException e1) {
							objs.remove((TcpClientImpl) skey.attachment());
							((TcpClientImpl) skey.attachment()).disconnect();
							val = false;
							log.warn("通信鏈路被關閉");
							log.warn(e1.getMessage());
						} catch (IOException e2) {
							objs.remove((TcpClientImpl) skey.attachment());
							((TcpClientImpl) skey.attachment()).disconnect();
							try {
								skey.channel().close();
							} catch (Exception ex) {
								ex.printStackTrace();
							}
							log.error("接收消息時發生錯誤, 可能遠程服務器已經被關閉, 也可能本地關閉連接");
							log.error(e2.getMessage());
						}
					}
				}
			}
		}
	}

	public void setDataHandler(IClientHandler handler, int maxPacketSize) {
		this.handler = handler;
		this.maxPacketSize = maxPacketSize;
		this.recvBuff = ByteBuffer.allocate(maxPacketSize);
		if (rt == null) {
			rt = new RecvThread();
			rt.start();
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.aceway.communication.tcp.TcpClient#send(java.io.Serializable)
	 */
	public int send(Serializable obj) {
		// TODO Auto-generated method stub
		try {
			ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
			ObjectOutputStream out = new ObjectOutputStream(byteOut);
			out.writeObject(obj);

			int len = byteOut.toByteArray().length;
			byte[] bytes = new byte[len + 8];
			TypeConvert.int2byte(1, bytes, 0);
			TypeConvert.int2byte(len, bytes, 4);
			System.arraycopy(byteOut.toByteArray(), 0, bytes, 8, byteOut
					.toByteArray().length);
			return send(bytes);		// kongds modified on 2007-06-20

		} catch (Exception e) {
			log.error("發送失敗",e);
			return 1;
		}

	}

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品自在欧美一区| 精品写真视频在线观看| 久久精品综合网| 91女神在线视频| 久久精品国内一区二区三区| 国产精品―色哟哟| 日韩欧美国产一区在线观看| 91无套直看片红桃| 国内国产精品久久| 日韩av电影免费观看高清完整版 | 精品视频资源站| 豆国产96在线|亚洲| 日韩av中文字幕一区二区三区| 亚洲欧洲av一区二区三区久久| 精品国产一区二区三区四区四| 欧美影院午夜播放| 99久久精品国产精品久久 | 91国在线观看| 粉嫩av一区二区三区粉嫩| 蜜桃视频一区二区三区在线观看| 亚洲黄色免费电影| 国产精品色哟哟网站| 国产日韩欧美精品在线| 日韩你懂的电影在线观看| 欧美三级一区二区| 在线观看视频一区二区欧美日韩| 不卡av免费在线观看| 成人一区二区三区视频在线观看 | 亚洲国产精品视频| 亚洲天堂中文字幕| 国产精品国产精品国产专区不蜜| 久久久高清一区二区三区| 精品国产乱码久久久久久老虎| 9191成人精品久久| 欧美日韩黄色一区二区| 91久久一区二区| 在线精品视频小说1| 色综合久久88色综合天天6| 91同城在线观看| 色综合久久中文综合久久97| 99精品偷自拍| 91久久奴性调教| 欧美性一级生活| 欧美网站大全在线观看| 欧美日韩久久久久久| 欧美日韩国产成人在线免费| 欧美色手机在线观看| 欧美日韩一区二区三区视频| 欧美日韩视频在线第一区 | 捆绑调教一区二区三区| 日本成人在线视频网站| 久久成人精品无人区| 国内精品在线播放| 国产91色综合久久免费分享| 成人97人人超碰人人99| 日本久久电影网| 7777精品伊人久久久大香线蕉超级流畅| 欧美日韩黄色一区二区| 日韩欧美国产三级| 国产视频一区在线播放| 中文字幕视频一区| 亚洲一区二区三区四区在线免费观看| 午夜欧美2019年伦理| 蜜臀av一区二区| 国产.欧美.日韩| 色一情一乱一乱一91av| 欧美日韩国产色站一区二区三区| 91精品国产综合久久香蕉麻豆| 亚洲精品在线观看网站| 综合激情成人伊人| 视频一区二区不卡| 国产白丝网站精品污在线入口| 99久久久免费精品国产一区二区| 欧美日韩第一区日日骚| 26uuu亚洲综合色欧美| 日韩伦理av电影| 蜜桃一区二区三区四区| 99这里只有精品| 日韩一区二区三区四区五区六区| 欧美激情自拍偷拍| 亚洲成人动漫在线观看| 国产精品综合二区| 欧美日韩国产精选| 国产精品久久久久久久久动漫| 日韩精品久久理论片| 成人免费视频网站在线观看| 777欧美精品| 自拍av一区二区三区| 狠狠色狠狠色综合系列| 色综合久久66| 久久免费视频色| 午夜欧美大尺度福利影院在线看| 成人毛片视频在线观看| 日韩一级免费观看| 亚洲乱码国产乱码精品精小说| 久久精品噜噜噜成人88aⅴ| 色婷婷精品久久二区二区蜜臀av | 国产精品久久久久久久午夜片 | 国产suv精品一区二区三区| 欧美日韩aaa| 亚洲色图制服诱惑| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 日韩欧美一区在线| 一区二区成人在线观看| 国产精一区二区三区| 91精品国产欧美一区二区成人 | 国产亚洲污的网站| 亚洲国产精品视频| 成人精品电影在线观看| 欧美电视剧在线看免费| 亚洲一卡二卡三卡四卡| 国产一区二区三区观看| 3d动漫精品啪啪1区2区免费| 亚洲天堂成人在线观看| 国产一区二区伦理片| 91精品久久久久久久久99蜜臂| 国产夜色精品一区二区av| 日韩在线卡一卡二| 欧美亚洲综合一区| 中文字幕一区日韩精品欧美| 老司机一区二区| 日韩一区国产二区欧美三区| 亚洲国产成人tv| 91麻豆高清视频| 国产欧美精品一区二区色综合| 丝袜a∨在线一区二区三区不卡| 成人一级片网址| 国产色一区二区| 国产综合成人久久大片91| 欧美一区二区三区电影| 亚洲精品国产精品乱码不99| 大胆欧美人体老妇| 久久久久久久久久久久电影| 日韩专区在线视频| 色婷婷亚洲精品| 国产精品成人网| 成人国产精品免费观看| 久久婷婷综合激情| 国产一区二区不卡老阿姨| 欧美va亚洲va香蕉在线| 午夜在线成人av| 色综合天天综合网天天狠天天| 国产精品久久久久久久久搜平片| 成人美女视频在线观看| 国产精品三级av| 国产成人精品亚洲日本在线桃色| 久久伊99综合婷婷久久伊| 日本不卡1234视频| 欧美日韩不卡视频| 日韩国产精品久久久| 91精品午夜视频| 美女高潮久久久| 精品久久久久久久久久久久久久久久久| 婷婷丁香久久五月婷婷| 欧美日韩一区成人| 亚洲精品午夜久久久| 欧洲一区二区av| 天天影视涩香欲综合网| 在线成人av网站| 久久se精品一区二区| 久久久精品国产免大香伊| 国产成人超碰人人澡人人澡| 欧美韩日一区二区三区| 99精品桃花视频在线观看| 怡红院av一区二区三区| 欧美无乱码久久久免费午夜一区| 日精品一区二区| 日韩欧美激情在线| 国内精品第一页| 国产精品入口麻豆原神| 在线欧美日韩国产| 天天影视色香欲综合网老头| 精品三级av在线| 丰满少妇久久久久久久| 国产精品久久网站| 欧美日韩国产成人在线91| 极品美女销魂一区二区三区| 国产精品毛片久久久久久| 日本高清无吗v一区| 偷窥少妇高潮呻吟av久久免费| 日韩美一区二区三区| 国产高清在线观看免费不卡| 亚洲欧洲综合另类| 欧美老女人第四色| 国产不卡视频一区| 一区二区三区在线视频免费| 欧美精品电影在线播放| 国产一本一道久久香蕉| 亚洲色图欧美在线| 欧美一区二区大片| 99久久99精品久久久久久| 日本一不卡视频| 国产亚洲美州欧州综合国| 日本韩国欧美一区| 国产成人一级电影| 亚洲一区视频在线| 欧美国产综合色视频| 欧美视频一二三区| 国产二区国产一区在线观看| 亚洲一区二区三区在线|