sblig

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            10 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks

          2012年10月18日 #

          最后 遺留一個(gè)問(wèn)題,繼續(xù)探索中....

          ?

          ?

          跟我學(xué)Spring3 學(xué)習(xí)筆記一

          跟我學(xué)Spring3 學(xué)習(xí)筆記二

          跟我學(xué)Spring3 學(xué)習(xí)筆記三

          跟我學(xué)Spring3 學(xué)習(xí)筆記四

          跟我學(xué)Spring3 學(xué)習(xí)筆記五 注入

          跟我學(xué)Spring3 學(xué)習(xí)筆記六 注入

          ?

          統(tǒng)一接口:

          ?

          public interface HelloApi {
          	public void sayHello();  
          }
          

          ?

          ?

          一、延遲初始化:

          ?

          /**
           * 延遲初始化Bean
           *     延遲初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用時(shí)才創(chuàng)建及初始化Bean。
           *     配置方式很簡(jiǎn)單只需在<bean>標(biāo)簽上指定 “l(fā)azy-init” 屬性值為“true”即可延遲初始化Bean。
           */
          public class DiLazyInit implements HelloApi{
          
          	public void sayHello() {
          		System.out.println("say DiInitDestory");
          	}
          	
          	public DiLazyInit(){
          		System.out.println("初始化 DiInitDestory");
          	}
          }

          ?

          ?

          配置延遲初始化:

          ?

          ?

          <!-- 延遲初始化Bean 
          	     延遲初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用時(shí)才創(chuàng)建及初始化Bean。
          	     配置方式很簡(jiǎn)單只需在<bean>標(biāo)簽上指定 “l(fā)azy-init” 屬性值為“true”即可延遲初始化Bean。 -->
          	<bean id="lazyinitDi" class="com.diinit.DiLazyInit"
          		lazy-init="true">
          	</bean>

          ?

          ?junit 進(jìn)行測(cè)試:

          ?

          @Test
          	public void testLazyInit(){
          		ApplicationContext context = new ClassPathXmlApplicationContext("initdepends.xml");
          		HelloApi lazyInit = context.getBean("lazyinitDi",HelloApi.class);
          		lazyInit.sayHello();
          		System.out.println("");
          	}
          ?

          ?

          注意這個(gè)時(shí)候的輸出結(jié)果:

          ?

          ?

          初始化 DiLazyInit

          say DiLazyInit

          ?

          ?

          ?

          ?

          二、 可以指定初始化和銷(xiāo)毀的順序

          ?

          ?

          /* 使用depends-on 是指 指定Bean初始化及銷(xiāo)毀時(shí)的順序,使用depends-on屬性指定的Bean要先初始化完畢
          *     后才初始化當(dāng)前Bean,由于只有“singleton”Bean能被Spring管理銷(xiāo)毀,所以當(dāng)指定的Bean都是“singleton”
          *     時(shí),使用depends-on屬性指定的Bean要在指定的Bean之后銷(xiāo)毀。
          *     “decorator”指定了“depends-on”屬性為“l(fā)azyinitDi”,所以在“decorator”Bean初始化之前要先初
          *     始化“l(fā)azyinitDi”,而在銷(xiāo)毀“l(fā)azyinitDi”之前先要銷(xiāo)毀“decorator”,大家注意一下銷(xiāo)毀順序,與文檔上的不符。
          *     “depends-on”屬性可以指定多個(gè)Bean,若指定多個(gè)Bean可以用“;”、“,”、空格分割。
          *     
          *  那“depends-on”有什么好處呢?
          *     主要是給出明確的初始化及銷(xiāo)毀順序,比如要初始化“decorator”時(shí)要確保“l(fā)azyinitDi”Bean的資源準(zhǔn)備好了,
          *     否則使用“decorator”時(shí)會(huì)看不到準(zhǔn)備的資源;而在銷(xiāo)毀時(shí)要先在“decorator”Bean的把對(duì)“helloApi”資源的引用釋
          *     放掉才能銷(xiāo)毀“l(fā)azyinitDi”,否則可能銷(xiāo)毀 “l(fā)azyinitDi”時(shí)而“decorator”還保持著資源訪問(wèn),造成資源不能釋放或釋放錯(cuò)誤。
          */
          public class ApiDecorator implements HelloApi{
          
          	private HelloApi helloApi;
          	
          	public ApiDecorator(){
          		System.out.println("初始化 ApiDecorator");
          	}
          	
          	public void sayHello() {
          		System.out.println("say ApiDecorator");
          		helloApi.sayHello();
          		
          	}
          
          	public HelloApi getHelloApi() {
          		return helloApi;
          	}
          
          	public void setHelloApi(HelloApi helloApi) {
          		this.helloApi = helloApi;
          	}
          }
          ?

          ?

          配置xml指定初始化和銷(xiāo)毀順序:

          ?

          <!-- 初始化及銷(xiāo)毀時(shí)的順序    
          	     “decorator”指定了“depends-on”屬性為“l(fā)azyinitDi”,所以在“decorator”Bean初始化之前
          	     要先初始化“l(fā)azyinitDi”,而在銷(xiāo)毀“l(fā)azyinitDi”之前先要銷(xiāo)毀“decorator”,大家注意一下銷(xiāo)毀順序 -->
          	<bean id="decorator" class="com.diinit.ApiDecorator"
          		depends-on="lazyinitDi">
          		<property name="helloApi">
          			<ref bean="lazyinitDi" />
          		</property>
          	</bean>
          ?

          ?

          ?

          ?junit 進(jìn)行測(cè)試:

          ?

          @Test
          	public void testLazyInit(){
          		ApplicationContext context = new ClassPathXmlApplicationContext("initdepends.xml");
          		HelloApi lazyInit = context.getBean("lazyinitDi",HelloApi.class);
          		lazyInit.sayHello();
          		System.out.println("");
          	}
          	
          	@Test
          	public void testDependsOn(){
          		ApplicationContext context= new ClassPathXmlApplicationContext("initdepends.xml");
          		HelloApi depends = context.getBean("decorator",HelloApi.class);
          		depends.sayHello();
          	}
          ?

          ?

          注意這個(gè)時(shí)候的輸出結(jié)果:

          ?

          ?

          初始化 DiLazyInit

          初始化 ApiDecorator ? ? ? ? ? ?//也是上面同樣的測(cè)試函數(shù) testLazyInit(),同樣的配置 ?這句是多打印出來(lái)的

          say DiLazyInit

          ?

          初始化 DiLazyInit

          初始化 ApiDecorator

          say ApiDecorator

          say DiLazyInit


          ?

          ?

          ?

          這突然多出來(lái)的打印結(jié)果,說(shuō)明進(jìn)行了ApiDecorator的對(duì)象的創(chuàng)建,

          但是在第一個(gè)配置中也沒(méi)涉及到?ApiDecorator 類(lèi)的加載,注入 ?。

          ?

          什么原因造成的呢?是一種隱藏的注入? 繼續(xù)探索中....

          ?

          ?



          已有 1 人發(fā)表留言,猛擊->>這里<<-參與討論


          ITeye推薦



          posted @ 2012-10-18 16:45 李凡 閱讀(165) | 評(píng)論 (0)編輯 收藏


          跟我學(xué)Spring3 學(xué)習(xí)筆記一

          跟我學(xué)Spring3 學(xué)習(xí)筆記二

          跟我學(xué)Spring3 學(xué)習(xí)筆記三

          跟我學(xué)Spring3 學(xué)習(xí)筆記四

          跟我學(xué)Spring3 學(xué)習(xí)筆記五 注入

          ?

          ?

          引用其它Bean

          ?

          一、構(gòu)造器注入方式:

          (1)通過(guò)” <constructor-arg>”標(biāo)簽的ref屬性來(lái)引用其他Bean

          ?

          (2)通過(guò)” <constructor-arg>”標(biāo)簽的子<ref>標(biāo)簽來(lái)引用其他Bean,使用bean屬性來(lái)指定引用的Bean

          二、setter注入方式:

          (1)通過(guò)” <property>”標(biāo)簽的ref屬性來(lái)引用其他Bean

          (2)通過(guò)” <property>”標(biāo)簽的子<ref>標(biāo)簽來(lái)引用其他Bean,使用bean屬性來(lái)指定引用的Bean

          ?

          ?

          public class HelloDiBean implements HelloApi{
          
          	private HelloApi helloApi;
          	private HelloApi helloApi2;
          	
          
          	public HelloDiBean(HelloApi helloApi){
          		this.helloApi = helloApi;
          	}
          	
          	public void sayHello() {
          		helloApi.sayHello();
          		helloApi2.sayHello();
          	}
          	
          
          	public HelloApi getHelloApi2() {
          		return helloApi2;
          	}
          
          	public void setHelloApi2(HelloApi helloApi2) {
          		this.helloApi2 = helloApi2;
          	}
          }
          

          ?配置注入引用其他的bean

          ?

          <!-- 引用其他的bean進(jìn)行注入 -->
          	<bean id="helloBean" class="com.dilist.HelloDiBean">
          		<constructor-arg index="0" ref="mapBean" />
          		<property name="helloApi2">
          			<ref bean="properBean" />
          		</property>
          	</bean>
          	
          ?

          其他引用bean 的高級(jí)用法:

          ?

          /**
           * Spring還提供了另外兩種更高級(jí)的配置方式,<ref local=””/>和<ref parent=””/>:
           * (1)<ref local=””/>配置方式:用于引用通過(guò)<bean id=”beanName”>方式中通過(guò)id屬性指定的Bean,
           * 		它能利用XML解析器的驗(yàn)證功能在讀取配置文件時(shí)來(lái)驗(yàn)證引用的Bean是否存在。
           * 		因此如果在當(dāng)前配置文件中有相互引用的Bean可以采用<ref local>方式從而如果配置錯(cuò)誤能在開(kāi)發(fā)調(diào)試時(shí)就發(fā)現(xiàn)錯(cuò)誤。
           * (2)<ref parent=””/>配置方式:用于引用父容器中的Bean,不會(huì)引用當(dāng)前容器中的Bean,
           *       當(dāng)然父容器中的Bean和當(dāng)前容器的Bean是可以重名的,獲取順序是直接到父容器找。
           */
          public class HelloHigh implements HelloApi{
          	
          	private HelloApi helloApi;
          	private HelloApi helloApi2;
          	
          
          	public HelloHigh(HelloApi helloApi){
          		this.helloApi = helloApi;
          	}
          	
          	public void sayHello() {
          		helloApi.sayHello();
          		System.out.println("");
          		helloApi2.sayHello();
          	}
          	
          
          	public HelloApi getHelloApi2() {
          		return helloApi2;
          	}
          
          	public void setHelloApi2(HelloApi helloApi2) {
          		this.helloApi2 = helloApi2;
          	}
          
          }
          ?

          helloworld.xml:

          ?

          <!-- 注入properties類(lèi)型 -->
          	<bean id="properBean" class="com.dilist.HelloDiProperties">
          		<property name="properties">
          			<props value-type="int" merge="default"><!-- 雖然指定value-type,但是不起作用 -->
          				<prop key="1">1sss</prop>           <!-- Properties 建和值都是String類(lèi)型 -->
          				<prop key="2">2</prop>
          			</props>
          		</property>
          		<property name="properties2">
          			<value> <!-- 分隔符可以是 “換行”、“;”、“,” 不建議該方式,優(yōu)先選擇第一種方式 -->
          				1=11
          				2=22;<!-- 這樣的分隔符好像沒(méi)用 -->
          			    3=33,
          				4=44
          			</value>
          		</property>
          	</bean>
          
          	<!-- Spring還提供了另外兩種更高級(jí)的配置方式,<ref local=””/>和<ref parent=””/> -->
          	<bean id="helloHigh" class="com.dilist.HelloHigh">
          		<constructor-arg index="0"><ref local="properBean" /></constructor-arg>
          		<property name="helloApi2"><ref parent="properBean" /></property>	
          	</bean>
          ?

          ?

          helloworldParent.xml:

          ?

          <!-- 注入properties類(lèi)型 -->
          	<bean id="properBean" class="com.dilist.HelloDiProperties">
          		<property name="properties">
          			<props value-type="int" merge="default"><!-- 雖然指定value-type,但是不起作用 -->
          				<prop key="1">2dss</prop>           <!-- Properties 建和值都是String類(lèi)型 -->
          				<prop key="2">3aas</prop>
          			</props>
          		</property>
          		<property name="properties2">
          			<value> <!-- 分隔符可以是 “換行”、“;”、“,” 不建議該方式,優(yōu)先選擇第一種方式 -->
          				1=111
          				2=222;<!-- 這樣的分隔符好像沒(méi)用 -->
          			    3=333,
          				4=444
          			</value>
          		</property>
          	</bean>
          ?

          調(diào)用處 利用加載父容器的方式,注入父容器中的Bean:

          ?

          ?

          @Test
          	public void testDiBeanHigh() {
          		// 以classes為根目錄算起
          		// 讀取配置文件實(shí)例化一個(gè)Ioc容器
          
          		// 初始化父容器
          		ApplicationContext parentContext = new ClassPathXmlApplicationContext(
          				"helloworldParent.xml");
          
          		// 初始化當(dāng)前容器
          		ApplicationContext context = new ClassPathXmlApplicationContext(
          				new String[] { "helloworld.xml" }, parentContext);
          
          		// 構(gòu)造 + setter注入 引用其他的bean注入
          		HelloApi helloApi = context.getBean("helloHigh", HelloApi.class);
          		helloApi.sayHello();
          
          	}


          已有 0 人發(fā)表留言,猛擊->>這里<<-參與討論


          ITeye推薦



          posted @ 2012-10-18 14:32 李凡 閱讀(148) | 評(píng)論 (0)編輯 收藏

          2012年10月17日 #



          已有 1 人發(fā)表留言,猛擊->>這里<<-參與討論


          ITeye推薦



          posted @ 2012-10-17 16:14 李凡 閱讀(126) | 評(píng)論 (0)編輯 收藏

          2012年10月16日 #

          ASM 進(jìn)行動(dòng)態(tài)生成class
          import org.objectweb.asm.ClassWriter;
          import org.objectweb.asm.MethodVisitor;
          import org.objectweb.asm.Opcodes;
          
          public class HelloWorld extends ClassLoader implements Opcodes{
          	public static void main(String[] args) {
          		ClassWriter cw = new ClassWriter(0);
          		cw.visit(V1_1, ACC_PUBLIC, "Example", null, "java/lang/Object", null);
          		MethodVisitor mw = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
          		mw.visitVarInsn(ALOAD, 0);
          		mw.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
          		mw.visitInsn(RETURN);
          		mw.visitMaxs(1, 1);
          		mw.visitEnd();
          		
          		mw = cw.visitMethod(ACC_PUBLIC+ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null);
          		mw.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
          		mw.visitLdcInsn("Hello World!");
          		mw.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
          		mw.visitInsn(RETURN);
          		mw.visitMaxs(2, 2);
          		mw.visitEnd(); 
          		
          		byte[] code = cw.toByteArray();
          		FileOutputStream fos;
          		try {
          			fos = new FileOutputStream("Example.class");
          			fos.write(code);
          			fos.close();
          			
          			HelloWorld loader = new HelloWorld();   
          		     Class exampleClass = loader   
          		         .defineClass("Example", code, 0, code.length);  
          				exampleClass.getMethods()[0].invoke(null, new Object[] { null });
          				
          		} catch (FileNotFoundException e) {
          			// TODO Auto-generated catch block
          			e.printStackTrace();
          		} catch (IOException e) {
          			// TODO Auto-generated catch block
          			e.printStackTrace();
          		} catch (IllegalArgumentException e) {
          			// TODO Auto-generated catch block
          			e.printStackTrace();
          		} catch (SecurityException e) {
          			// TODO Auto-generated catch block
          			e.printStackTrace();
          		} catch (IllegalAccessException e) {
          			// TODO Auto-generated catch block
          			e.printStackTrace();
          		} catch (InvocationTargetException e) {
          			// TODO Auto-generated catch block
          			e.printStackTrace();
          		}
          		
          		
          	}
          }

          ?

          cglib 動(dòng)態(tài)生成class 并進(jìn)行攔截

          ?

          public class MyClass {
          	public void print() {
          		System.out.println("I'm in MyClass.print!");
          	}
          }
          
          
          import net.sf.cglib.proxy.Callback;
          import net.sf.cglib.proxy.Enhancer;
          import net.sf.cglib.proxy.MethodInterceptor;
          import net.sf.cglib.proxy.MethodProxy;
          
          public class Main {
          
          	public static void main(String[] args) {
          
          		Enhancer enhancer = new Enhancer();
          		enhancer.setSuperclass(MyClass.class);
          		enhancer.setCallback((Callback) new MethodInterceptorImpl());
          		MyClass my = (MyClass) enhancer.create();
          		my.print();
          	}
          
          	private static class MethodInterceptorImpl implements MethodInterceptor {
          
          		public Object intercept(Object obj, Method method, Object[] args,
          				MethodProxy proxy) throws Throwable {
          			// log something
          			System.out.println(method + " intercepted!");
          
          			proxy.invokeSuper(obj, args);
          			return null;
          		}
          
          	}
          }
          ?

          已有 1 人發(fā)表留言,猛擊->>這里<<-參與討論


          ITeye推薦



          posted @ 2012-10-16 11:18 李凡 閱讀(154) | 評(píng)論 (0)編輯 收藏

          2012年10月10日 #

          工具類(lèi):

          ?

          ?

          import java.io.BufferedReader;
          import java.io.ByteArrayOutputStream;
          import java.io.DataInputStream;
          import java.io.DataOutputStream;
          import java.io.File;
          import java.io.FileFilter;
          import java.io.FileInputStream;
          import java.io.FileOutputStream;
          import java.io.IOException;
          import java.io.InputStreamReader;
          import java.io.RandomAccessFile;
          import java.util.ArrayList;
          import java.util.List;
          import java.util.StringTokenizer;
          
          import sun.net.TelnetInputStream;
          import sun.net.TelnetOutputStream;
          import sun.net.ftp.FtpClient;
          import sun.net.ftp.FtpLoginException;
          
          public class FtpUtil {
          
          
          	/**
          	 * @param args
          	 */
          	public static void main(String[] args) {
          		FtpUtil ftp = new FtpUtil();
          		ftp.connect("10.16.12.75", 21, "ftpusr", "ftpusr");
          		try {
          			// 上傳目錄下文件 并可以遞歸到子目錄
          			// ftp.upPathFile(new File("D:\\ALSC"), "ALSC/");
          			// 下載目錄下多個(gè)文件 并可以遞歸到子目錄
          			//ftp.downPathFile("/opt/ftp/outgoing/cs/", "D:/outgoing/csvc");
          			
          			// 切換目錄
          			ftp.setPath("/opt/ftp/book");
          			System.out.println(ftp.getDir());
          			for (String file : ftp.getFileNameList()) {
          				System.out.println(file);
          			}
          
          			// 切換到父級(jí)目錄
          			ftp.up();
          			
          			// 創(chuàng)建多目錄
          			// ftp.createDir("aa/bb/cc");
          			ftp.setPath("ftpTest");
          			
          			// 刪除文件
          			ftp.deleteFile("bbb.bmp");
          			System.out.println(ftp.getDir());
          			for (String file : ftp.getFileNameList()) {
          				System.out.println(file);
          			}
          			// 上傳 下載單個(gè)文件
          			ftp.uploadFile("c:/aaa.bmp", "bbb.bmp");
          			ftp.downloadFile("bbb.bmp", "c:/bbb");
          
          			List<String> list = ftp.getFileList();
          			for (String file : list) {
          				System.out.println(file);
          			}
          
          			ftp.setPath("/opt/ftp/outgoing/cs");
          			String patternStr = "^CSGET_[0-9]{4}_0085_"+"20120926"+"_[0-9]{3}";
          			// 過(guò)濾,獲取目錄下的文件列表
          			list = ftp.getFileList(new CSFilter(patternStr));
          			for (String file : list) {
          				System.out.println(file);
          			}
          			
          			//下載 過(guò)濾后的文件
          			ftp.downPathFile("/opt/ftp/outgoing/cs/", "D:/outgoing/csvc",new CSFilter(patternStr));
          
          		} catch (IOException e) {
          			// TODO Auto-generated catch block
          			e.printStackTrace();
          		}
          
          		ftp.close();
          	}
          	
          	private FtpClient ftpClient = null;
          
          	/**
          	 * 打開(kāi)連接
          	 * 
          	 * @param hostname
          	 * @param port
          	 * @param username
          	 * @param passwd
          	 * @return
          	 */
          	public void connect(String hostname, int port, String username,
          			String passwd) {
          		String msg = "";
          		try {
          			ftpClient = new FtpClient(hostname, port);
          			ftpClient.login(username, passwd);
          			ftpClient.binary();
          			msg = "連接成功!";
          		} catch (FtpLoginException e) {
          			msg = "登錄主機(jī)失敗,可能是用戶(hù)名密碼錯(cuò)誤!";
          			e.printStackTrace();
          		} catch (IOException e) {
          			msg = "登錄主機(jī)失敗,請(qǐng)檢驗(yàn)端品是否正確!";
          			e.printStackTrace();
          		} catch (SecurityException e) {
          			msg = "無(wú)權(quán)連接主機(jī),主確認(rèn)是否有權(quán)限連接主機(jī)!";
          			e.printStackTrace();
          		}
          		System.out.println(msg);
          	}
          
          	/**
          	 * 關(guān)閉連接
          	 */
          	public void close() {
          		if (ftpClient == null) {
          			return;
          		}
          		try {
          			ftpClient.closeServer();
          		} catch (IOException e) {
          			// TODO Auto-generated catch block
          			e.printStackTrace();
          		}
          	}
          
          	/**
          	 * 重命名
          	 * 
          	 * @param oldName
          	 * @param newName
          	 * @return
          	 */
          	public boolean renameFile(String oldName, String newName) {
          		boolean result = false;
          		try {
          			this.ftpClient.rename(oldName, newName);
          			result = true;
          		} catch (IOException e) {
          			e.printStackTrace();
          		}
          		return result;
          	}
          
          	/**
          	 * 取得相對(duì)于當(dāng)前連接目錄的某個(gè)目錄下所有文件列表
          	 * 
          	 * @param path
          	 * @return
          	 */
          	public List getFileList(String path) {
          		List list = new ArrayList();
          		DataInputStream dis;
          		try {
          			dis = new DataInputStream(ftpClient.nameList(this.getDir() + path));
          			String filename = "";
          			while ((filename = dis.readLine()) != null) {
          				list.add(filename);
          			}
          		} catch (IOException e) {
          			e.printStackTrace();
          		}
          		return list;
          	}
          
          	/**
          	 * 讀取文件列表
          	 * 
          	 * @return
          	 * @throws IOException
          	 */
          	public List<String> getFileList() throws IOException {
          		List<String> fileList = new ArrayList<String>();
          		InputStreamReader isr = null;
          		BufferedReader br = null;
          		try {
          			isr = new InputStreamReader(this.ftpClient.list());
          			br = new BufferedReader(isr);
          			String fileName = "";
          			while (true) {
          				fileName = br.readLine();
          				if (fileName == null) {
          					break;
          				}
          				fileList.add(fileName);
          			}
          		} finally {
          			if (br != null) {
          				try {
          					br.close();
          				} catch (IOException e) {
          					e.printStackTrace();
          				}
          			}
          			if (isr != null) {
          				try {
          					isr.close();
          				} catch (IOException e) {
          					e.printStackTrace();
          				}
          			}
          		}
          		return fileList;
          	}
          
          	/**
          	 * 讀取文件列表
          	 * 
          	 * @return
          	 * @throws IOException
          	 */
          	public List<String> getFileList(FileFilter filter) throws IOException {
          		List<String> fileList = new ArrayList<String>();
          		InputStreamReader isr = null;
          		BufferedReader br = null;
          		try {
          			isr = new InputStreamReader(this.ftpClient.list());
          			br = new BufferedReader(isr);
          			String fileName = "";
          			while (true) {
          				fileName = br.readLine();
          				if (fileName == null) {
          					break;
          				}
          				if ((filter == null) || filter.accept(new File(fileName)))
          					fileList.add(fileName);
          			}
          		} finally {
          			if (br != null) {
          				try {
          					br.close();
          				} catch (IOException e) {
          					e.printStackTrace();
          				}
          			}
          			if (isr != null) {
          				try {
          					isr.close();
          				} catch (IOException e) {
          					e.printStackTrace();
          				}
          			}
          		}
          		return fileList;
          	}
          
          	/**
          	 * 獲取文件名列表
          	 * 
          	 * @return
          	 * @throws IOException
          	 */
          	public List<String> getFileNameList() throws IOException {
          		List<String> fileNameList = new ArrayList<String>();
          		InputStreamReader isr = null;
          		BufferedReader br = null;
          		try {
          			isr = new InputStreamReader(this.ftpClient.nameList(this.getDir()));
          			br = new BufferedReader(isr);
          
          			String fileName = "";
          			while (true) {
          				fileName = br.readLine();
          				if (fileName == null) {
          					break;
          				}
          				fileNameList.add(fileName);
          			}
          		} finally {
          			if (br != null) {
          				try {
          					br.close();
          				} catch (IOException e) {
          					e.printStackTrace();
          				}
          			}
          			if (isr != null) {
          				try {
          					isr.close();
          				} catch (IOException e) {
          					e.printStackTrace();
          				}
          			}
          		}
          		return fileNameList;
          
          	}
          
          	/**
          	 * 設(shè)置路徑 切換目錄
          	 * 
          	 * @param path
          	 * @return
          	 */
          	public boolean setPath(String path) {
          		if (this.ftpClient != null) {
          			try {
          				ftpClient.cd(path);
          				return true;
          			} catch (IOException e) {
          				e.printStackTrace();
          				return false;
          			}
          		} else {
          			return false;
          		}
          	}
          
          	/**
          	 * 判斷是否為目錄
          	 * 
          	 * @param line
          	 * @return
          	 */
          	public boolean isDir(String line) {
          		return line.startsWith("d");
          	}
          
          	/**
          	 * 檢查文件夾在當(dāng)前目錄下是否存在
          	 * 
          	 * @param dir
          	 * @return
          	 */
          	public boolean isDirExist(String dir) {
          		String pwd = "";
          		try {
          			pwd = ftpClient.pwd();
          			ftpClient.cd(dir);
          			ftpClient.cd(pwd);
          		} catch (Exception e) {
          			return false;
          		}
          		return true;
          	}
          
          	/**
          	 * 獲取當(dāng)前路徑
          	 * 
          	 * @return
          	 * @throws IOException
          	 */
          	public String getDir() throws IOException {
          		return this.ftpClient.pwd();
          	}
          
          	/**
          	 * 向上 切換到父級(jí)目錄
          	 * 
          	 * @throws IOException
          	 */
          	public void up() throws IOException {
          		if ("/".equals(ftpClient.pwd()) || "http://".equals(ftpClient.pwd())) {
          			return;
          		}
          		this.ftpClient.cdUp();
          	}
          
          	/**
          	 * 刪除文件
          	 * 
          	 * @param fileName
          	 * @return
          	 */
          	public void deleteFile(String fileName) {
          		ftpClient.sendServer("dele " + fileName + "\r\n");// 這個(gè)地方一定要注意 加上 \r\n
          		try {
          			if (ftpClient.readServerResponse() != 250)
          				System.out.println("刪除異常");
          		} catch (IOException e) {
          			// TODO Auto-generated catch block
          			e.printStackTrace();
          		}
          	}
          
          	/**
          	 * 在當(dāng)前目錄下創(chuàng)建文件夾
          	 * 
          	 * @param dir
          	 * @return
          	 * @throws Exception
          	 */
          	public boolean createDir(String dir) {
          		try {
          			ftpClient.ascii();
          			StringTokenizer s = new StringTokenizer(dir, "/"); // sign
          			s.countTokens();
          			String pathName = ftpClient.pwd();
          			while (s.hasMoreElements()) {
          				pathName = pathName + "/" + (String) s.nextElement();
          				try {
          					ftpClient.sendServer("MKD " + pathName + "\r\n");
          				} catch (Exception e) {
          					e = null;
          					return false;
          				}
          				ftpClient.readServerResponse();
          			}
          			ftpClient.binary();
          			return true;
          		} catch (IOException e1) {
          			e1.printStackTrace();
          			return false;
          		}
          	}
          
          	/**
          	 * 上傳文件
          	 * 
          	 * @param localFile
          	 * @param targetFileName
          	 * @return
          	 */
          	public boolean uploadFile(String localFile, String targetFileName) {
          		boolean result = false;
          		if (this.ftpClient == null) {
          			return false;
          		}
          		TelnetOutputStream tos = null;
          		RandomAccessFile sendFile = null;
          		DataOutputStream dos = null;
          		try {
          			File file = new File(localFile);
          			sendFile = new RandomAccessFile(file, "r");
          			sendFile.seek(0);
          			tos = this.ftpClient.put(targetFileName);
          			dos = new DataOutputStream(tos);
          			int ch = 0;
          			while (sendFile.getFilePointer() < sendFile.length()) {
          				ch = sendFile.read();
          				dos.write(ch);
          			}
          			result = true;
          		} catch (Exception ex) {
          			result = false;
          		} finally {
          			if (tos != null) {
          				try {
          					tos.close();
          				} catch (IOException e) {
          					e.printStackTrace();
          				}
          			}
          			if (dos != null) {
          				try {
          					dos.close();
          				} catch (IOException e) {
          					e.printStackTrace();
          				}
          			}
          			if (sendFile != null) {
          				try {
          					sendFile.close();
          				} catch (IOException e) {
          					e.printStackTrace();
          				}
          			}
          		}
          		return result;
          	}
          
          	/**
          	 * 上傳文件
          	 * 
          	 * @param localFile
          	 * @param targetFileName
          	 * @return
          	 */
          	public boolean uploadFile(File localFile, String targetFileName) {
          		boolean result = false;
          		if (this.ftpClient == null) {
          			return false;
          		}
          		TelnetOutputStream tos = null;
          		RandomAccessFile sendFile = null;
          		DataOutputStream dos = null;
          		try {
          			sendFile = new RandomAccessFile(localFile, "r");
          			sendFile.seek(0);
          			tos = this.ftpClient.put(targetFileName);
          			dos = new DataOutputStream(tos);
          			int ch = 0;
          			while (sendFile.getFilePointer() < sendFile.length()) {
          				ch = sendFile.read();
          				dos.write(ch);
          			}
          			result = true;
          		} catch (Exception ex) {
          			result = false;
          		} finally {
          			if (tos != null) {
          				try {
          					tos.close();
          				} catch (IOException e) {
          					e.printStackTrace();
          				}
          			}
          			if (dos != null) {
          				try {
          					dos.close();
          				} catch (IOException e) {
          					e.printStackTrace();
          				}
          			}
          			if (sendFile != null) {
          				try {
          					sendFile.close();
          				} catch (IOException e) {
          					e.printStackTrace();
          				}
          			}
          		}
          		return result;
          	}
          
          	/**
          	 * 上傳本地目錄下的所有文件到服務(wù)器上
          	 * 
          	 * @param srcPath
          	 * @param tagPath
          	 * @param level
          	 *            遞歸的級(jí)別
          	 * @return
          	 * @see [類(lèi)、類(lèi)#方法、類(lèi)#成員]
          	 */
          	public boolean upPathFile(File srcPathFile, String tagPath) {
          		buildList(tagPath.substring(0, tagPath.lastIndexOf("/")));
          		boolean result = true;
          
          		try {
          			File temp[] = srcPathFile.listFiles();
          			for (int i = 0; i < temp.length; i++) {
          				if (temp[i].isDirectory()) {
          					if (tagPath.lastIndexOf('/') > 0) {
          						result = upPathFile(temp[i], tagPath
          								+ temp[i].getName() + "/");
          					} else {
          						result = upPathFile(temp[i], tagPath + "/"
          								+ temp[i].getName() + "/");
          					}
          				} else {
          					if (tagPath.lastIndexOf('/') > 0) {
          						result = uploadFile(temp[i], tagPath
          								+ temp[i].getName());
          					} else {
          						result = uploadFile(temp[i], tagPath + "/"
          								+ temp[i].getName());
          					}
          
          				}
          			}
          
          		} catch (Exception e) {
          			e.printStackTrace();
          		}
          
          		return result;
          	}
          
          	/**
          	 * 下載文件
          	 * 
          	 * @param srcFileName
          	 * @param targetFileName
          	 * @return
          	 */
          	public boolean downloadFile(String srcFileName, String targetFileName) {
          		if (this.ftpClient == null) {
          			return false;
          		}
          		TelnetInputStream tis = null;
          		RandomAccessFile getFile = null;
          		boolean result = true;
          		try {
          			File file = new File(targetFileName);
          			getFile = new RandomAccessFile(file, "rw");
          			getFile.seek(0);
          			tis = this.ftpClient.get(srcFileName);
          			DataInputStream dis = new DataInputStream(tis);
          			int ch = 0;
          			while (true) {
          				ch = dis.read();
          				if (ch < 0) {
          					break;
          				}
          				getFile.write(ch);
          			}
          			getFile.close();
          		} catch (IOException e) {
          			result = false;
          		} finally {
          			if (getFile != null) {
          				try {
          					getFile.close();
          				} catch (IOException e) {
          					e.printStackTrace();
          				}
          			}
          			if (tis != null) {
          				try {
          					tis.close();
          				} catch (IOException e) {
          					e.printStackTrace();
          				}
          			}
          		}
          		return result;
          	}
          
          	/**
          	 * 下載文件
          	 * 
          	 * @param srcFileName
          	 * @param targetFileName
          	 * @return
          	 */
          	public boolean downloadFile(String srcFileName, File targetFileName) {
          		if (this.ftpClient == null) {
          			return false;
          		}
          		TelnetInputStream tis = null;
          		RandomAccessFile getFile = null;
          		boolean result = true;
          		try {
          			getFile = new RandomAccessFile(targetFileName, "rw");
          			getFile.seek(0);
          			tis = this.ftpClient.get(srcFileName);
          			DataInputStream dis = new DataInputStream(tis);
          			int ch = 0;
          			while (true) {
          				ch = dis.read();
          				if (ch < 0) {
          					break;
          				}
          				getFile.write(ch);
          			}
          			getFile.close();
          		} catch (IOException e) {
          			result = false;
          		} finally {
          			if (getFile != null) {
          				try {
          					getFile.close();
          				} catch (IOException e) {
          					e.printStackTrace();
          				}
          			}
          			if (tis != null) {
          				try {
          					tis.close();
          				} catch (IOException e) {
          					e.printStackTrace();
          				}
          			}
          		}
          		return result;
          	}
          
          	/**
          	 * 下載遠(yuǎn)程目錄下的所有文件到本地
          	 * 
          	 * @param srcPathFile
          	 *            遠(yuǎn)程目錄文件
          	 * @param tagPath
          	 *            本地存放目錄
          	 * @return
          	 * @throws IOException
          	 * @see [類(lèi)、類(lèi)#方法、類(lèi)#成員]
          	 */
          	public boolean downPathFile(String srcPath, String tagPath)
          			throws IOException {
          
          		boolean result = true;
          
          		File tagFile = new File(tagPath);
          		tagFile.mkdirs();
          
          		setPath(srcPath);
          		String tempPath = "";
          		List<String> list = getFileList();
          		for (int i = 0; i < list.size(); i++) {
          			String currPath = list.get(i);
          			String fileName = getFileName(currPath);
          
          			String currPathFul = getDir() + "/" + fileName;
          
          			if (tagPath.lastIndexOf('/') > 0) {
          				tempPath = tagPath
          						+ currPathFul.substring(currPathFul.lastIndexOf("/"),
          								currPathFul.length());
          			} else {
          				tempPath = tagPath
          						+ "/"
          						+ currPathFul.substring(currPathFul.lastIndexOf("/"),
          								currPathFul.length());
          			}
          
          			if (isDir(currPath)) {
          				srcPath = currPathFul + "/";
          				downPathFile(srcPath, tempPath);
          			} else {
          				srcPath = currPathFul;
          				downloadFile(srcPath, tempPath);
          			}
          		}
          
          		return result;
          	}
          
          	/**
          	 * 下載遠(yuǎn)程目錄下的所有文件到本地,過(guò)濾規(guī)則
          	 * 
          	 * @param srcPathFile
          	 *            遠(yuǎn)程目錄文件
          	 * @param tagPath
          	 *            本地存放目錄
          	 * @param fileFilter
          	 * 			  下載過(guò)濾文件
          	 * @return
          	 * @throws IOException
          	 * @see [類(lèi)、類(lèi)#方法、類(lèi)#成員]
          	 */
          	public boolean downPathFile(String srcPath, String tagPath,
          			FileFilter fileFilter) throws IOException {
          
          		boolean result = true;
          
          		File tagFile = new File(tagPath);
          		tagFile.mkdirs();
          
          		setPath(srcPath);
          		String tempPath = "";
          		List<String> list = getFileList(fileFilter);
          		for (int i = 0; i < list.size(); i++) {
          			String currPath = list.get(i);
          			String fileName = getFileName(currPath);
          
          			String currPathFul = getDir() + "/" + fileName;
          
          			if (tagPath.lastIndexOf('/') > 0) {
          				tempPath = tagPath
          						+ currPathFul.substring(currPathFul.lastIndexOf("/"),
          								currPathFul.length());
          			} else {
          				tempPath = tagPath
          						+ "/"
          						+ currPathFul.substring(currPathFul.lastIndexOf("/"),
          								currPathFul.length());
          			}
          
          			if (isDir(currPath)) {
          				srcPath = currPathFul + "/";
          				downPathFile(srcPath, tempPath, fileFilter);
          			} else {
          				srcPath = currPathFul;
          				downloadFile(srcPath, tempPath);
          			}
          		}
          
          		return result;
          	}
          
          	public String getFileName(String line) {
          		int i;
          		String filename = (String) parseLine(line).get(8);
          		for (i = 9; i < parseLine(line).size(); i++) {
          			filename = filename + " " + ((String) parseLine(line).get(i));
          		}
          		return filename;
          	}
          
          	// 處理getFileList取得的行信息
          	private ArrayList parseLine(String line) {
          		ArrayList s1 = new ArrayList();
          		StringTokenizer st = new StringTokenizer(line, " ");
          		while (st.hasMoreTokens()) {
          			s1.add(st.nextToken());
          		}
          		return s1;
          	}
          
          	/**
          	 * 從FTP文件服務(wù)器上下載文件SourceFileName,到本地destinationFileName 所有的文件名中都要求包括完整的路徑名在內(nèi)
          	 * 
          	 * @param SourceFileName
          	 *            String
          	 * @param destinationFileName
          	 *            String
          	 * @throws Exception
          	 */
          	public void downFile(String SourceFileName, String destinationFileName)
          			throws Exception {
          		ftpClient.binary(); // 一定要使用二進(jìn)制模式
          		TelnetInputStream ftpIn = ftpClient.get(SourceFileName);
          		byte[] buf = new byte[204800];
          		int bufsize = 0;
          		FileOutputStream ftpOut = new FileOutputStream(destinationFileName);
          		while ((bufsize = ftpIn.read(buf, 0, buf.length)) != -1) {
          			ftpOut.write(buf, 0, bufsize);
          		}
          		ftpOut.close();
          		ftpIn.close();
          	}
          
          	/**
          	 * 從FTP文件服務(wù)器上下載文件,輸出到字節(jié)數(shù)組中
          	 * 
          	 * @param SourceFileName
          	 *            String
          	 * @return byte[]
          	 * @throws Exception
          	 */
          	public byte[] downFile(String SourceFileName) throws Exception {
          		ftpClient.binary(); // 一定要使用二進(jìn)制模式
          		TelnetInputStream ftpIn = ftpClient.get(SourceFileName);
          		ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
          		byte[] buf = new byte[204800];
          		int bufsize = 0;
          
          		while ((bufsize = ftpIn.read(buf, 0, buf.length)) != -1) {
          			byteOut.write(buf, 0, bufsize);
          		}
          		byte[] return_arraybyte = byteOut.toByteArray();
          		byteOut.close();
          		ftpIn.close();
          		return return_arraybyte;
          	}
          
          	/**
          	 * 上傳文件到FTP服務(wù)器,destination路徑以FTP服務(wù)器的"/"開(kāi)始,帶文件名、 上傳文件只能使用二進(jìn)制模式,
          	 * 當(dāng)文件存在時(shí)再次上傳則會(huì)覆蓋
          	 * 
          	 * @param source
          	 *            String
          	 * @param destination
          	 *            String
          	 * @throws Exception
          	 */
          	public void upFile(String source, String destination) throws Exception {
          		buildList(destination.substring(0, destination.lastIndexOf("/")));
          		ftpClient.binary(); // 此行代碼必須放在buildList之后
          		TelnetOutputStream ftpOut = ftpClient.put(destination);
          		TelnetInputStream ftpIn = new TelnetInputStream(new FileInputStream(
          				source), true);
          		byte[] buf = new byte[204800];
          		int bufsize = 0;
          		while ((bufsize = ftpIn.read(buf, 0, buf.length)) != -1) {
          			ftpOut.write(buf, 0, bufsize);
          		}
          		ftpIn.close();
          		ftpOut.close();
          	}
          
          	/**
          	 * JSP中的流上傳到FTP服務(wù)器, 上傳文件只能使用二進(jìn)制模式,當(dāng)文件存在時(shí)再次上傳則會(huì)覆蓋 字節(jié)數(shù)組做為文件的輸入流,
          	 * 此方法適用于JSP中通過(guò)request輸入流來(lái)直接上傳文件在RequestUpload類(lèi)中調(diào)用了此方法,
          	 * destination路徑以FTP服務(wù)器的"/"開(kāi)始,帶文件名
          	 * 
          	 * @param sourceData
          	 *            byte[]
          	 * @param destination
          	 *            String
          	 * @throws Exception
          	 */
          	public void upFile(byte[] sourceData, String destination) throws Exception {
          		buildList(destination.substring(0, destination.lastIndexOf("/")));
          		ftpClient.binary(); // 此行代碼必須放在buildList之后
          		TelnetOutputStream ftpOut = ftpClient.put(destination);
          		ftpOut.write(sourceData, 0, sourceData.length);
          		// ftpOut.flush();
          		ftpOut.close();
          	}
          
          	/**
          	 * 在FTP服務(wù)器上建立指定的目錄,當(dāng)目錄已經(jīng)存在的情下不會(huì)影響目錄下的文件,這樣用以判斷FTP
          	 * 上傳文件時(shí)保證目錄的存在目錄格式必須以"/"根目錄開(kāi)頭
          	 * 
          	 * @param pathList
          	 *            String
          	 * @throws Exception
          	 */
          	public void buildList(String pathList) {
          		try {
          			ftpClient.ascii();
          
          			StringTokenizer s = new StringTokenizer(pathList, "/"); // sign
          			int count = s.countTokens();
          			String pathName = "";
          			while (s.hasMoreElements()) {
          				pathName = pathName + (String) s.nextElement();
          				try {
          					ftpClient.sendServer("XMKD " + pathName + "\r\n");
          				} catch (Exception e) {
          					e = null;
          				}
          				int reply = ftpClient.readServerResponse();
          				pathName = pathName + "/";
          			}
          			ftpClient.binary();
          		} catch (IOException e1) {
          			// TODO Auto-generated catch block
          			e1.printStackTrace();
          		}
          	}
          
          }

          ?過(guò)濾:

          ?

          import java.io.File;
          import java.io.FileFilter;
          import java.util.ArrayList;
          import java.util.StringTokenizer;
          import java.util.regex.Pattern;
          
          public class CSFilter implements FileFilter {
          
          	private String patternStr ;
          	
          	//"^CSGET_[0-9]{4}_0085_"+"20120926"+"_[0-9]{3}"
          	private Pattern pattern ;
          
          	public CSVCFilter(String str){
          		this.patternStr = str;
          		this.pattern = Pattern.compile(patternStr);
          	}
          	public boolean accept(File pathname) {
          		String strName = pathname.getName();
          		if (!isDir(strName)) {
          			strName = getFileName(strName);
          			System.out.println(strName);
          			return pattern.matcher(strName).matches();
          		}
          		return true;
          	}
          
          	public boolean isDir(String strName) {
          		return ((String) parseLine(strName).get(0)).indexOf("d") != -1;
          	}
          
          	public String getFileName(String line) {
          		int i;
          		String filename = (String) parseLine(line).get(8);
          		for (i = 9; i < parseLine(line).size(); i++) {
          			filename = filename + " " + ((String) parseLine(line).get(i));
          		}
          		return filename;
          	}
          
          	// 處理getFileList取得的行信息
          	private ArrayList parseLine(String line) {
          		ArrayList s1 = new ArrayList();
          		StringTokenizer st = new StringTokenizer(line, " ");
          		while (st.hasMoreTokens()) {
          			s1.add(st.nextToken());
          		}
          		return s1;
          	}
          
          	public String getFileSize(String line) {
          		return (String) parseLine(line).get(4);
          	}
          
          	public String getFileDate(String line) {
          		ArrayList a = parseLine(line);
          		return (String) a.get(5) + " " + (String) a.get(6) + " "
          				+ (String) a.get(7);
          	}
          
          }

          ?

          下載速度提升

          ?

          public boolean downloadFile(String srcFileName, File targetFileName)
          {
          //.....
          
          //下載速度太慢,用如下方式進(jìn)行提升
                                  byte[] recvbuf = new byte[1024];
          			while((ch = dis.read(recvbuf)) > 0){
          				getFile.write(recvbuf,0,ch);
          			}
          
          //			while (true) {
          //				ch = dis.read();
          //				if (ch < 0) {
          //					break;
          //				}
          //				getFile.write(ch);
          //			}
          
          
          
          //...
          
          }
          ?

          ?

          ?



          已有 0 人發(fā)表留言,猛擊->>這里<<-參與討論


          ITeye推薦



          posted @ 2012-10-10 16:26 李凡 閱讀(355) | 評(píng)論 (0)編輯 收藏

          2012年9月28日 #

          ?服務(wù)器端:

          ?

          ?

           // 1. 分配一個(gè) ServerSocketChannel 文件描述符
                      serverChannel = ServerSocketChannel.open();
          
                      // 2. 從 ServerSocketChannel里獲取一個(gè)對(duì)于的 socket
                      serverSocket = serverChannel.socket();
          
                      // 3. 生成一個(gè) Selector
                      selector = Selector.open();
          
                      // 4. 把 socket 綁定到端口上
                      serverSocket.bind(new InetSocketAddress(iport));
          
                      // 5. serverChannel 未非bolck
                      serverChannel.configureBlocking(false);
          
                      // 6. 通過(guò)Selector注冊(cè)ServerSocketChannel: 只能注冊(cè) accept
                      // 而SocketChannel可以注冊(cè)CONNENCT,READ,WRITE ; register -> validOps
                      // 在各個(gè)子類(lèi)實(shí)現(xiàn)不同
                      serverChannel.register(selector, SelectionKey.OP_ACCEPT);
                      while (true) {
          			try {
          				// 獲得IO準(zhǔn)備就緒的channel數(shù)量
          				int n = selector.select();
          
          				// 沒(méi)有channel準(zhǔn)備就緒,繼續(xù)執(zhí)行
          				if (n == 0) {
          					continue;
          				}
          
          				// 用一個(gè)iterator返回Selector的selectedkeys
          				Iterator it = selector.selectedKeys().iterator();
          
          				// 處理每一個(gè)SelectionKey
          				while (it.hasNext()) {
          					SelectionKey key = (SelectionKey) it.next();
          
          					// 判斷是否有新的連接到達(dá)
          					if (key.isAcceptable()) {
          						
          						// 返回SelectionKey的ServerSocketChannel
          						ServerSocketChannel server = (ServerSocketChannel) key
          								.channel();
          						System.out.println("有連接");
          						SocketChannel channel = server.accept();
          						
          						registerChannel(selector, channel, SelectionKey.OP_READ);
          						
          						doWork(channel);
          					}
          
          					// 判斷是否有數(shù)據(jù)在此channel里需要讀取
          					if (key.isReadable()) {
          						processData(key);
          					}
          				}
          
          				// 刪除 selectedkeys
          				it.remove();
          
          			} catch (IOException e) {
          				// TODO Auto-generated catch block
          				e.printStackTrace();
          			}
          		}

          ?

          ?

          ?

          ?客戶(hù)端:

          ?

          ?

            //打開(kāi)socket通道
          		SocketChannel socketChannel = SocketChannel.open();
          		//設(shè)置非阻塞方式
          		socketChannel.configureBlocking(false);
          		//打開(kāi)選擇器
          		Selector selector = Selector.open();
          		//注冊(cè)連接到服務(wù)器socket動(dòng)作
          		socketChannel.register(selector, SelectionKey.OP_CONNECT);
          		//連接
          		socketChannel.connect( new InetSocketAddress("localhost",9988));
          		
          		Set<SelectionKey> selectkeySets;
          		SelectionKey selectionKey;
          		Iterator<SelectionKey> iterator;
          		
          		//與服務(wù)器通信通道
          		SocketChannel clientChannel ;
          
          	       while(true){
          			//選擇一組建,其相應(yīng)的通道已為I/O操作準(zhǔn)備就緒
          			//此方法執(zhí)行處于阻塞模式的選擇操作
          			selector.select(TIME_OUT);
          			
          			//返回此選擇器的已選擇鍵集。
          			selectkeySets = selector.selectedKeys();
          			iterator = selectkeySets.iterator();
          			
          			
          			while(iterator.hasNext()){
          				selectionKey = iterator.next();
          				
          				if (selectionKey.isConnectable()) {
                                            clientChannel = (SocketChannel)selectionKey.channel();
          					// 判斷此通道上是否正在進(jìn)行連接操作。  
                                            // 完成套接字通道的連接過(guò)程。  
          					if (clientChannel.isConnectionPending()) {//判斷此通道上是否正在進(jìn)行連接操作
          						clientChannel.finishConnect();  //完成套接字通道的連接過(guò)程
                                             
                                            }
                                            clientChannel.register(selector, SelectionKey.OP_WRITE);
                                      }else if (selectionKey.isReadable()) {
          					clientChannel = (SocketChannel)selectionKey.channel();
          					//將緩沖區(qū)清空
          					receiveBuffer.clear();
          					//讀取服務(wù)器發(fā)送來(lái)的數(shù)據(jù)庫(kù)到緩沖區(qū)
          					count = clientChannel.read(receiveBuffer);//count 讀取到的字節(jié)數(shù)
          					if (count > 0) {
          						clientChannel.register(selector, SelectionKey.OP_WRITE);
          					}
                                      }else if (selectionKey.isWritable()) {
          					sendBuffer.clear();
          					clientChannel = (SocketChannel)selectionKey.channel();
          					clientChannel.write(sendBuffer);
          					System.out.println("客戶(hù)端向服務(wù)器發(fā)送數(shù)據(jù):"+sendText);
          					clientChannel.register(selector, SelectionKey.OP_READ);
                                      }
                               }
                           }
          
          

          ?



          已有 0 人發(fā)表留言,猛擊->>這里<<-參與討論


          ITeye推薦



          posted @ 2012-09-28 16:31 李凡 閱讀(296) | 評(píng)論 (0)編輯 收藏

          服務(wù)器端:
          ????

          // 創(chuàng)建一個(gè)非阻塞的server端socket ,用NIO
          		SocketAcceptor acceptor = new NioSocketAcceptor();
          
          		// 創(chuàng)建接收數(shù)據(jù)的過(guò)濾器
          		DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
          
          		// 設(shè)定這個(gè)過(guò)濾器一行一行(\r\n)的讀數(shù)據(jù)
          		chain.addLast("myChin", new ProtocolCodecFilter(
          				new TextLineCodecFactory()));
          
          		//設(shè)定服務(wù)器端的消息處理器,一個(gè)SamplMinaServerHandler對(duì)象(自己實(shí)現(xiàn))繼承IoHandlerAdapter
          		acceptor.setHandler(new IoHandlerAdapter(){
          			//當(dāng)一個(gè)客端端連結(jié)進(jìn)入時(shí)
          			@Override
          			public void sessionOpened(IoSession session) throws Exception {
          				// TODO Auto-generated method stub
          				System.out.println("incomming client : "+session.getRemoteAddress());
          			}
          			
          			//當(dāng)一個(gè)客戶(hù)端關(guān)閉時(shí)
          			@Override
          			public void sessionClosed(IoSession session) throws Exception {
          				// TODO Auto-generated method stub
          				System.out.println("on client disconnect : "+session.getRemoteAddress());
          			}
          
          			//當(dāng)客戶(hù)端發(fā)送的消息到達(dá)時(shí)
          			@Override
          			public void messageReceived(IoSession session, Object message)
          					throws Exception {
          				// TODO Auto-generated method stub
          				String s =  (String)message;
          				System.out.println("收到客戶(hù)端發(fā)來(lái)的消息:"+s);
          				//測(cè)試將消息回給客戶(hù)端
          				session.write(s+count);
          				count ++;
          			}
          			private int count =0;
          		});
          		//端口號(hào)
          		int bindPort= 9988;
          		
          		//綁定打開(kāi),啟動(dòng)服務(wù)器
          		acceptor.bind(new InetSocketAddress(bindPort));
          		
          		System.out.println("Mina Server is listing on:="+bindPort);

          ??
          ???
          ???
          ??客戶(hù)端:
          ???

          // create TCP/IP connector
          		NioSocketConnector connector = new NioSocketConnector();
          
          		// 創(chuàng)建接收數(shù)據(jù)的過(guò)濾器
          		DefaultIoFilterChainBuilder chain = connector.getFilterChain();
          
          		// 設(shè)定這個(gè)過(guò)濾器將一行一行(/r/n)的讀取數(shù)據(jù)
          		chain.addLast("myChin", new ProtocolCodecFilter(
          				new TextLineCodecFactory()));
          
          		// 設(shè)定服務(wù)器端的消息處理器:一個(gè)SamplMinaServerHandler對(duì)象,
          		connector.setHandler(new IoHandlerAdapter(){
          			@Override
          			public void messageReceived(IoSession session, Object message)
          					throws Exception {
          				// 我們己設(shè)定了服務(wù)器解析消息的規(guī)則是一行一行讀取,這里就可轉(zhuǎn)為String:
          				String s = (String) message;
          				// Write the received data back to remote peer
          				System.out.println("服務(wù)器發(fā)來(lái)的收到消息: " + s);
          				// 測(cè)試將消息回送給客戶(hù)端
          				session.write(s);
          			}
          
          			@Override
          			public void sessionClosed(IoSession session) throws Exception {
          				// TODO Auto-generated method stub
          				System.out.println("one Clinet Disconnect !");
          			}
          
          			@Override
          			public void sessionOpened(IoSession session) throws Exception {
          				// TODO Auto-generated method stub
          				System.out.println("incomming client  " + session.getRemoteAddress());
          				session.write("我來(lái)啦........");
          			}
          		});
          		
          		// Set connect timeout.
          		connector.setConnectTimeout(30);
          		
          		// 連結(jié)到服務(wù)器:
          		ConnectFuture cf = connector.connect(new InetSocketAddress("localhost",
          				9988));
          		
          		// Wait for the connection attempt to be finished.
          		cf.awaitUninterruptibly();
          		cf.getSession().getCloseFuture().awaitUninterruptibly();
          		connector.dispose();

          ?
          ???
          ???
          ???????



          已有 0 人發(fā)表留言,猛擊->>這里<<-參與討論


          ITeye推薦



          posted @ 2012-09-28 10:52 李凡 閱讀(196) | 評(píng)論 (0)編輯 收藏

          2012年9月27日 #

          分表 ?用用戶(hù)ID位數(shù)取模

          ?

          分區(qū) ?用時(shí)間進(jìn)行分區(qū)



          已有 0 人發(fā)表留言,猛擊->>這里<<-參與討論


          ITeye推薦



          posted @ 2012-09-27 09:58 李凡 閱讀(100) | 評(píng)論 (0)編輯 收藏

          2012年9月25日 #

          URL url = new URL("http://blog.csdn.net/mywait_00/article/details/1698627");
          
          //設(shè)置代理
          Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("openproxy.fsfd.com", 8080));
          //打開(kāi)代理
          URLConnection coon = url.openConnection(proxy);
          //訪問(wèn)的時(shí)候需要設(shè)置 user-agent
          coon.setRequestProperty("User-Agent","Mozila/4.0(compatible;MSIE 5.0;Windows XP;DigExt");
          
          BufferedReader in = new BufferedReader(new InputStreamReader(coon.getInputStream()));
          
          String inputLine; StringBuffer html = new StringBuffer();
          while ((inputLine = in.readLine()) != null) {
              html.append(inputLine);
          }
          
          

          ?



          已有 0 人發(fā)表留言,猛擊->>這里<<-參與討論


          ITeye推薦



          posted @ 2012-09-25 13:52 李凡 閱讀(101) | 評(píng)論 (0)編輯 收藏

          2012年9月21日 #

          Java.nio中的主要類(lèi)
          ServerSocketChannel:ServerSocket的替代類(lèi).
          SocketChannel:Socket的替代類(lèi)
          Selector:為ServerSocketChannel監(jiān)控接受就緒事件,為SocketChannel監(jiān)控連接就緒,讀就緒和寫(xiě)就緒事件
          SelectionKey:代表ServerSocketChannel及SocketChannel向Selector注冊(cè)事件句柄
          向SocketChannel和ServerSocketChannel注冊(cè)事件:
          SelectionKey key=serverSocketChannel.register(selector,op)
          Op的可選值
          對(duì)于ServerSocketChannel只有一個(gè)事件:
          (1)SelectionKye.OP_ACCEPT:接受連接就緒事件,表示至少有了一個(gè)客戶(hù)連接,服務(wù)器可以接受這個(gè)連接
          SocketChannel可能發(fā)生3種事件
          (1)SelectionKey.OP_CONNECT:連接就為事件,表示客戶(hù)與服務(wù)器的連接已經(jīng)成功
          (2)SelectionKey.OP_WRITE/OP_READ:寫(xiě)的就緒事件,表示已經(jīng)可以向輸出流寫(xiě)數(shù)據(jù)了SocketChannel提供了接受和發(fā)送的方法
          可以使用:read(ByteBuffer)write(ByteBuffer)寫(xiě)入寫(xiě)出

          ?ServerSocketChannel類(lèi)
          方法:(PS繼承過(guò)SelectableChannel類(lèi)的方法)
          ??? (1)open()靜態(tài)方法獲取ServerSocketChannel對(duì)象.
          ???? (2)accept同ServerSocket,不過(guò)獲取的是SocketChannel,根據(jù)是否阻塞返回null還是阻塞,值得注意的是accept返回的SocketChannel是阻塞模式的使用configureBlocking更改模式
          ???? (3)socket() 返回關(guān)聯(lián)的ServerSocket
          SocketChannel類(lèi)
          此類(lèi)是Socket類(lèi)的替代類(lèi)?
          方法:(PS繼承過(guò)SelectableChannel類(lèi)的方法)
          (1)open() open(SocketAddress)靜態(tài)方法用來(lái)創(chuàng)建SocketChannel對(duì)象,第二個(gè)重寫(xiě)還會(huì)建立于遠(yuǎn)程服務(wù)器的連接.
          (2)socket()返回關(guān)聯(lián)的Socket對(duì)象
          (3)isConnected()是否建立連接
          (4)isConnectionPending判斷是否正在進(jìn)行遠(yuǎn)程連接
          (5)connect() 建立遠(yuǎn)程連接() 根據(jù)是否阻塞而不同
          (6)finishConnect() 視圖完成遠(yuǎn)程連接?
          (7)read()讀取數(shù)據(jù)(這個(gè)應(yīng)該是接數(shù)據(jù))
          (8)write()寫(xiě)數(shù)據(jù)(這個(gè)是發(fā)送數(shù)據(jù))

          聲明:

          public static int PORT = 8888;
          ServerSocketChannel serverChannel;
          ServerSocket serverSocket;
          Selector  selector;

          ?
          初始化:

          // 1. 分配一個(gè) ServerSocketChannel 文件描述符
          serverChannel = ServerSocketChannel.open();
          
          // 2. 從 ServerSocketChannel里獲取一個(gè)對(duì)于的 socket
          serverSocket = serverChannel.socket();
          
          // 3. 生成一個(gè) Selector
          selector = Selector.open();
          
          // 4. 把 socket 綁定到端口上
          serverSocket.bind(new InetSocketAddress(iport));
          
          // 5. serverChannel 未非bolck
          serverChannel.configureBlocking(false);
          
          // 6. 通過(guò)Selector注冊(cè)ServerSocketChannel: 只能注冊(cè) accept
          // 而SocketChannel可以注冊(cè)CONNENCT,READ,WRITE ; register -> validOps
          // 在各個(gè)子類(lèi)實(shí)現(xiàn)不同
          serverChannel.register(selector, SelectionKey.OP_ACCEPT);

          ?
          開(kāi)啟服務(wù):

          while (true) {
          	try {
          			// 獲得IO準(zhǔn)備就緒的channel數(shù)量
          			int n = selector.select();
          			
          			// 沒(méi)有channel準(zhǔn)備就緒,繼續(xù)執(zhí)行
          			if (n == 0) {
          				continue;
          			}
          			
          			// 用一個(gè)iterator返回Selector的selectedkeys
          			Iterator it = selector.selectedKeys().iterator();
          			
          			// 處理每一個(gè)SelectionKey
          			while (it.hasNext()) {
          						SelectionKey key = (SelectionKey) it.next();
          					
          						// 判斷是否有新的連接到達(dá)
          						if (key.isAcceptable()) {
          					
          							// 返回SelectionKey的ServerSocketChannel
          							ServerSocketChannel server = (ServerSocketChannel) key
          							.channel();
          							System.out.println("有連接");
          							SocketChannel channel = server.accept();
          							
          							registerChannel(selector, channel, SelectionKey.OP_READ);
          							
          							doWork(channel);
          						}
          					
          						// 判斷是否有數(shù)據(jù)在此channel里需要讀取
          						if (key.isReadable()) {
          							processData(key);
          						}
          			}
          			
          			// 刪除 selectedkeys
          			it.remove();
          	
          		} catch (IOException e) {
          	// TODO Auto-generated catch block
          	e.printStackTrace();
          		}
          }

          ?




          已有 0 人發(fā)表留言,猛擊->>這里<<-參與討論


          ITeye推薦



          posted @ 2012-09-21 16:08 李凡 閱讀(171) | 評(píng)論 (0)編輯 收藏

          僅列出標(biāo)題  
          主站蜘蛛池模板: 泌阳县| 邯郸市| 新宾| 鄱阳县| 黄石市| 凤城市| 沙坪坝区| 彰武县| 平阴县| 青川县| 子长县| 锡林郭勒盟| 突泉县| 临泉县| 利川市| 新密市| 乌兰浩特市| 德化县| 通河县| 萨嘎县| 龙里县| 桓台县| 绩溪县| 肇源县| 论坛| 湘潭县| 阿巴嘎旗| 德格县| 平舆县| 元谋县| 澄江县| 通河县| 分宜县| 安徽省| 和田县| 永州市| 阿拉尔市| 郓城县| 遂平县| 治多县| 合作市|