读书人

JAVA编程有关问题(网络点对点文件传输

发布时间: 2013-11-06 16:26:37 作者: rapoo

JAVA编程问题求助(网络点对点文件传输程序的修改)
本人在敲一个网络点对点文件传输与远程执行程序的代码时发现:书上的源代码是要分别运行在两台电脑上实现文件传输,但是本人目前就一台电脑,因此想尝试一下改一下代码实现自己传送文件,自己接收文件,因此,我用代码在要传输的源文件的同一目录下新建了一个不同名的文本文档,想接收自己电脑传出去的文件,并将输入流写到新建的不同名的文本文档,同时自动以记事本打开这个文件。结果发现有文件传送成功的提示,但是在新建的文件不会自动打开,并且手动打开后发现接收的输入流并没有成功写入,同时还有抛出异常。
下面是我运行结果的截图,同时还有修改后的代码,请大家帮我看看是什么原因导致的?麻烦大家了!

JAVA编程有关问题(网络点对点文件传输程序的修改)
import java.lang.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import javax.swing.*;

public class j03130401 extends Frame implements Runnable {
File recFileDir; //欲接收的文件所含的上层目录
File F1=new File("testDir\\readme2.txt");
String reFile; //欲接收的文件
boolean canRecFile; //是否可以接收文件
//===========================
String sendFile; //欲发送的文件

boolean canSendFile; //是否可以发送文件
//============================
Label L1,L2,L3,L4,L5;
TextField T1,T2,T3,T4;
List list1;
Button B1;

public j03130401(){
this.setLayout(null);
this.setBounds(200, 200, 370, 400);
this.setTitle("TCP点对点文件传输");
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
//==============================================
L1=new Label("对方IP:");
L1.setBounds(10, 25, 55, 25);
L1.setBackground(new Color(255,193,255));
this.add(L1);

T1=new TextField("192.168.1.100");
T1.setBounds(70,25,110,25);
this.add(T1);

L2=new Label("对方接收的PORT:");
L2.setBounds(10, 60,120, 25);
L2.setBackground(new Color(255,193,255));
this.add(L2);

T2=new TextField("2222");
T2.setBounds(135, 60, 55, 25);
this.add(T2);

L3=new Label("欲传送的文件:");
L3.setBounds(10,95,95,25);
L3.setBackground(new Color(255,193,255));
this.add(L3);

T3=new TextField("testDir\\readme.txt");
T3.setBounds(105,95,200,25);
this.add(T3);

B1=new Button("传送");
B1.setBounds(310, 95, 50, 25);
B1.addActionListener(new myActionListener());
this.add(B1);

L4=new Label("本地收的PORT:");
L4.setBounds(10, 150, 120, 25);
L4.setBackground(new Color(255,193,255));
this.add(L4);

T4=new TextField("2222");
T4.setBounds(135, 150, 55, 25);
T4.setEnabled(false);
this.add(T4);

L5=new Label("接收文件存储至:");
L5.setBounds(10, 185, 120, 25);
L5.setBackground(new Color(255,193,255));
this.add(L5);

list1=new List();
list1.setBounds(10, 220, 350, 160);
this.add(list1);
//======================================
this.setBackground(new Color(220,255,255));
this.setVisible(true);
} //public j03130401() end

public static void main(String[] args){
File F1=new File("testDir\\readme2.txt");
try{
F1.createNewFile();
}
catch(Exception e){
JOptionPane.showMessageDialog(null,"错误1");
}


new Thread(new j03130401()).start();
}

private boolean reFileName(ServerSocket serverTcp) throws IOException{


Socket connSocket = serverTcp.accept(); //接受client请求,建立连机
InputStreamReader serverInput=new InputStreamReader(connSocket.getInputStream()); //将byte流转成char流
int data;
StringBuffer sb=new StringBuffer();
while((data=serverInput.read())!=-1){
sb.append(String.valueOf((char) data)); //逐字读入文件存储在sb
}
reFile=sb.toString();
serverInput.close();
connSocket.close();

if(reFile==""||reFile==null){
return false;
}
else
return true;

}

private void checkFile(){
recFileDir=new File(reFile).getParentFile();
if((recFileDir!=null)&&(!recFileDir.exists())){ //有上层目录 ,且还存在
canRecFile=recFileDir.mkdirs();
}
else
canRecFile=true;

}

public void reFile(ServerSocket serverTcp,byte[] theData) throws IOException{
if(!(this.reFileName(serverTcp)))
return;

checkFile();
if(!canRecFile){ //欲接收的文件目录未建立
JOptionPane.showMessageDialog(null, "无法建立目录");
return;
}
//=================================
Socket connSocket=serverTcp.accept(); //接受client请求,建立联机
BufferedInputStream serverInput = new BufferedInputStream (connSocket.getInputStream());
BufferedOutputStream FileObj= new BufferedOutputStream(new FileOutputStream(reFile));

while(serverInput.read(theData)!=-1){
FileObj.write(theData); //写到本地的文件
}
serverInput.close();
FileObj.flush();
FileObj.close();
connSocket.close();

list1.add(new File(reFile).getCanonicalPath());
Runtime.getRuntime().exec("notepad"+reFile); //以记事本尝试开启刚才复制的文件
boolean canRecFile=false;
String reFile="";
File recFileDir=null;

}

public void run(){
byte[] theData = new byte[1];
try{
ServerSocket serverTcp=new ServerSocket(Integer.parseInt(T4.getText().trim()));
while(true){
this.reFile(serverTcp,theData);
Thread.sleep(200);
}
}
catch(Exception e){
JOptionPane.showMessageDialog(null,e.getMessage());
}
}//void run end

class myActionListener implements ActionListener{
public void sendFileName() throws UnknownHostException,IOException{
sendFile=T3.getText().trim();
reFile=F1.getName().trim();
File sourFile=new File(sendFile);
if(!sourFile.exists()){
canSendFile=false;
JOptionPane.showMessageDialog(null, "欲送出的文件不存在!");
return;
}

Socket tcpSocket=new Socket(T1.getText().trim(),Integer.parseInt(T2.getText().trim()));
BufferedOutputStream opStream=new BufferedOutputStream(tcpSocket.getOutputStream());
opStream.write(reFile.getBytes(),0, reFile.getBytes().length);

opStream.flush(); //清空缓冲区的数据
opStream.close();
tcpSocket.close();
canSendFile=true;
}


public void sendFile() throws UnknownHostException,FileNotFoundException,IOException{


sendFileName();
if(!canSendFile)
return;
//======================
byte[] tmpData=new byte[1];
Socket tcpSocket = new Socket(T1.getText().trim(),Integer.parseInt(T2.getText().trim()));
BufferedInputStream fileObj=new BufferedInputStream(new FileInputStream(sendFile));
BufferedOutputStream opStream=new BufferedOutputStream(tcpSocket.getOutputStream());
while(fileObj.read(tmpData)!=-1){
opStream.write(tmpData);
}

fileObj.close();
opStream.flush();
opStream.close();
tcpSocket.close();

canSendFile=false;
sendFile="";
JOptionPane.showMessageDialog(null, "文件传送完毕!");
}
public void actionPerformed(ActionEvent e){
try{
this.sendFile();
}
catch(IOException ecp){
JOptionPane.showMessageDialog(null,"此异常未出现");
}
}
}


}

文件传输 java 编程 网络
[解决办法]
reFile 路径不对,只有文件名, 这样readme2.txt应该在文件的执行目录下,不在testDir下

读书人网 >Java相关

热点推荐