⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xfile.java

📁 该代码是《JXTA-java P2P网络编程技术》一书的源代码
💻 JAVA
字号:
/**《JXTA网络编程》例程
*"第五章  JXTA深入编程" 即时消息软件XChat  
*
@作者 慈黎利
@单位 清华大学计算机系软件所知识工程组
@版本 1.0
@联系方式 cili@163.com
@描述 P2PSockst 负责在Peer 之间建立通讯连接
Copyright 2002
*/

import java.io.*;
import java.net.*;
import net.jxta.pipe.*; 
import net.jxta.impl.endpoint.*;
import demo.p2psocket.*;

//源程序 XFile.java

public class XFile implements PipeMsgListener {
	P2PSocket pps=new P2PSocket(); 
	BaseMessage bm=new BaseMessage();
	
	public XFile() {
		pps.setInputPipeName("002");
		pps.setInListener(this);
		pps.bind();
		pps.setOutListener(pps);
		pps.connect("001");
	}     
	/**
	* 实现InputPipe 的监听器
	* @param event 获得消息事件
	*/
	public void pipeMsgEvent ( PipeMsgEvent event ){
		String temp=null;
		MessageImpl mi=(MessageImpl) event.getMessage();
		
		temp=mi.getString(BaseMessage.FILE_MESSAGE_TYPE);
		if (temp.equals(BaseMessage.FILE_LIST_REQUEST))  
			{ doFileListRequest(mi); return;}
		if (temp.equals(BaseMessage.FILE_DOWNLOAD_REQUEST))
			{ doFileDownloadRequest(mi); return;}
		if (temp.equals(BaseMessage.FILE_DOWNLOAD))
			{ doFileDownload(mi); return;}
		if (temp.equals(BaseMessage.FILE_LIST))
			{ doFileList(mi); return;}
    	if (temp.equals(BaseMessage.FILE_UPLOAD))
    		{ doFileUpload(mi); return;}
		
	}
	
	/**
	* 处理对共享文件列表的请求,向对方发送包含共享文件名的列表的消息
	* @param mi 获得的Message
	*/
	public void doFileListRequest(MessageImpl mi) {
		System.out.println("捕获一个本地共享文件列表的请求!");
		pps.send(bm.newFileMessage(this.listFile(),pps.getOutputPipeName(),
				pps.getInputPipeName(),bm.FILE_LIST,"Temp"));		
	}
	
	/**
	* 处理获得的文件列表消息
	* @param mi 获得的Message
	*/
	public void doFileList(MessageImpl mi) {
		System.out.println("捕获一个共享文件的列表!");
		MessageElementImpl mei=(MessageElementImpl)mi.getElement(BaseMessage.FILE_LIST);
		this.displayFile(mei.getStream());		
	}
	
	/**
	* 处理对某个共享文件的下载的求情,向对方发送含有指定共享文件流的消息
	* @param mi 获得的Message
	*/
	public void doFileDownloadRequest(MessageImpl mi) {
		System.out.println("捕获一个下载本地共享文件的请求!");
		String file_name=mi.getString(bm.FILE_NAME);
		pps.send(bm.newFileMessage(file2Stream(file_name),pps.getOutputPipeName(),
				pps.getInputPipeName(),bm.FILE_DOWNLOAD,file_name));
	}
	
	/**
	* 处理获得的共享文件消息
	* @param mi 获得的Message
	*/
	public void doFileDownload(MessageImpl mi) {
		System.out.println("捕获一个需要下载的共享文件!");
		MessageElementImpl mei=(MessageElementImpl)mi.getElement(BaseMessage.FILE_DOWNLOAD);
		String file_name=mi.getString(bm.FILE_NAME);
		save2File(mei.getStream(),file_name);		
	}
	
	/**
	* 处理上传的共享文件消息
	* @param mi 获得的Message
	*/
	public void doFileUpload(MessageImpl mi) {
		System.out.println("捕获一个上传的共享文件!");
		MessageElementImpl mei=(MessageElementImpl)mi.getElement(BaseMessage.FILE_UPLOAD);
		String file_name=mi.getString(bm.FILE_NAME);
		save2File(mei.getStream(),file_name);	
	}
	
	/**
	* 把流中的信息写道文件中
	* @param is  数据源流
	* @param fname  将要写入的文件
	*/
	public void save2File(InputStream is,String fname) {
		int length;
		byte buf[]=new byte[1024];
		try {
			FileOutputStream fos=new FileOutputStream("share/"+fname);
			BufferedOutputStream bos=new BufferedOutputStream(fos);
			BufferedInputStream bis=new BufferedInputStream(is);
			while ((length=bis.read(buf,0,1024))!=-1) {
				bos.write(buf,0,length);
				bos.flush();
			}
			bis.close();
			bos.close();
			fos.close();			
		}catch (IOException ioe) {
			System.out.println("写入文件错误:"+ioe);		
		}			
	}
	
	/**
	* 把文件读取到流中
	* @param file  将要读入的文件
	* @return 返回包含文件信息的流
	*/
	public InputStream file2Stream(String file) {
		try {
			FileInputStream fis=new FileInputStream("share/"+file);
			return fis;
		}catch (FileNotFoundException fnfe) {
			System.out.println("无法读取本地文件");
			System.exit(-1);
		}
		return null;
	}
	
	/**
	*  将指定目录下的文件名读入流中
	* @return 返回包含文件名列表的流
	*/
	public InputStream listFile() {
		try {
			String userpath=System.getProperty("user.dir");
			URL url=new URL("file:///"+userpath+"/share");
			return url.openStream();
		}catch (MalformedURLException murle) {
			System.err.println("获取共享文件名出错");
			System.exit(-1);
		
		}catch (IOException ioe) {
			System.err.println("获取共享文件名发生I/O错误");
			System.exit(-1);
		} 
		return null;
	}
	
	/**
	* 将流中的内容显示出来
	* @param is  将要显示的流
	*/
	public void displayFile(InputStream is) {
		try {
			BufferedReader br=new BufferedReader(new InputStreamReader(is));
			String s=br.readLine();
			while (s!=null) {
				toScreen(s);
				s=br.readLine();
			}
		}catch (IOException ioe) {
			System.err.println("显示文件发生I/O错误");
			System.exit(-1);
		} 	
	}
	
	/**
	* 显示字符串
	* @param s 被显示的字符串
	*/
	public void toScreen (String s) {
		System.out.println(s);
	}
	public static void main(String args[]) {
		XFile xf=new XFile();
		xf.pps.send(xf.bm.newFileMessage(null,null,
			null,BaseMessage.FILE_LIST_REQUEST,"Temp"));
		xf.pps.send(xf.bm.newFileMessage(xf.file2Stream("Upload.txt"),xf.pps.getInputPipeName(),
			xf.pps.getOutputPipeName(),BaseMessage.FILE_UPLOAD,
			"Upload.txt"));
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -