?? xfile.java
字號(hào):
/**《JXTA網(wǎng)絡(luò)編程》例程
*"第五章 JXTA深入編程" 即時(shí)消息軟件XFile
*
@作者 慈黎利
@單位 清華大學(xué)計(jì)算機(jī)系軟件所知識(shí)工程組
@版本 1.0
@聯(lián)系方式 cili@163.com
@描述 利用P2PSocket 在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("001");
pps.setInListener(this);
pps.bind();
pps.setOutListener(pps);
pps.connect("002");
}
/**
* 實(shí)現(xiàn)InputPipe 的監(jiān)聽(tīng)器
* @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;}
}
/**
* 處理對(duì)共享文件列表的請(qǐng)求,向?qū)Ψ桨l(fā)送包含共享文件名的列表的消息
* @param mi 獲得的Message
*/
public void doFileListRequest(MessageImpl mi) {
System.out.println("捕獲一個(gè)本地共享文件列表的請(qǐng)求!");
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("捕獲一個(gè)共享文件的列表!");
MessageElementImpl mei=(MessageElementImpl)mi.getElement(BaseMessage.FILE_LIST);
this.displayFile(mei.getStream());
}
/**
* 處理對(duì)某個(gè)共享文件的下載的求情,向?qū)Ψ桨l(fā)送含有指定共享文件流的消息
* @param mi 獲得的Message
*/
public void doFileDownloadRequest(MessageImpl mi) {
System.out.println("捕獲一個(gè)下載本地共享文件的請(qǐng)求!");
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("捕獲一個(gè)需要下載的共享文件!");
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("捕獲一個(gè)上傳的共享文件!");
MessageElementImpl mei=(MessageElementImpl)mi.getElement(BaseMessage.FILE_UPLOAD);
String file_name=mi.getString(bm.FILE_NAME);
save2File(mei.getStream(),file_name);
}
/**
* 把流中的信息寫(xiě)道文件中
* @param is 數(shù)據(jù)源流
* @param fname 將要寫(xiě)入的文件
*/
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("寫(xiě)入文件錯(cuò)誤:"+ioe);
}
}
/**
* 把文件讀取到流中
* @param file 將要讀入的文件
* @return 返回包含文件信息的流
*/
public InputStream file2Stream(String file) {
try {
FileInputStream fis=new FileInputStream("share/"+file);
return fis;
}catch (FileNotFoundException fnfe) {
System.out.println("無(wú)法讀取本地文件");
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("獲取共享文件名出錯(cuò)");
System.exit(-1);
}catch (IOException ioe) {
System.err.println("獲取共享文件名發(fā)生I/O錯(cuò)誤");
System.exit(-1);
}
return null;
}
/**
* 將流中的內(nèi)容顯示出來(lái)
* @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("顯示文件發(fā)生I/O錯(cuò)誤");
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(null,null,null,BaseMessage.FILE_DOWNLOAD_REQUEST,
"Download.txt"));
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -