Socket server=new ServerSocket(port).accept(); Socket client=new Socket(ip,port);
DataInputStream in=new DataInputStream(server.getInputStream); DataOutputStream out=new DataOutputStream(client.getInputStream);
DataOutputStream out=new DataOutputStream(server.getInputStream); DataInputStream in=new DataInputStream(client.getInputStream);
out.writeXXX(XXX) ; → in.readXXX(XXX);
in.readXXX(XXX); ← out.writeXXX(XXX) ;
文件传输窗口菜单栏:
“操作菜单栏”
1.显示端口
2.发送文件
3.发起聊天
4.设置连接指向
5.显示IP地址
打开第一个网络传输软件
设置这台电脑的端口号
输入对方电脑的端口号
打开第二个网络传输软件,重复以上步骤
然后有两个传输软件
如果要连接其它电脑则让对方点击显示IP地址然后把IP地址告诉这边,然后点击设置连接指向设置对方的IP地址即可。
其中一个点击发送文件
弹出选择文件窗口
选择文件后
点击发送按钮,对方窗口弹框
选择是,弹框选择保存路径
传送中…
传送完成
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FileDialog;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Date;
import javax.swing.*;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.filechooser.FileSystemView;
public class FileTransfer {
public static void main(String args[]){
javax.swing.SwingUtilities.invokeLater(new Runnable(){
public void run(){
new ViewOfFileTransfer();
}//run
});
}//main
}//FileTransfer
class Accept_Communication extends Thread implements ActionListener, WindowListener{
private JFrame frame;
private DataInputStream in;
private DataOutputStream out;
private JTextField InputText;
private JTextArea OutputText;
private boolean isOpening;
Accept_Communication(Socket client) throws IOException{
//构造网络输入输出流
in=new DataInputStream(client.getInputStream());
out=new DataOutputStream(client.getOutputStream());
System.out.println("向对方发送true");
out.writeBoolean(true);
setFrame();
isOpening=true;
start();
}
public void setFrame(){
//创建并设置窗体
frame=new JFrame("聊天工具");
//添加WindowListener事件
frame.addWindowListener(this);
//创建并设置菜单栏
JMenuBar menubar=new JMenuBar();
//创建并设置菜单"文件"
JMenu menu=new JMenu("操作");
//创建并设置子菜单"关闭"
JMenuItem Close=new JMenuItem("关闭");
//创建输入框
InputText=new JTextField();
//创建聊天框
OutputText=new JTextArea();
//设置聊天框滚动条
JScrollPane RollPane=new JScrollPane(OutputText);
//聊天框设置不可修改
OutputText.setEditable(false);
//设置聊天框大小
RollPane.setPreferredSize(new Dimension(250,100));
//聊天框设置自动换行
OutputText.setLineWrap(true);
//窗体关闭时退出程序
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
//设置窗口大小
frame.setSize(500,400);
//设置窗口位置
frame.setLocation(250,250);
//是否可见
frame.setVisible(true);
//是否可改变大小
frame.setResizable(true);
//显示窗体
frame.setVisible(true);
//窗体添加菜单栏,菜单栏放在窗体北侧
frame.add(menubar,BorderLayout.NORTH);
//窗体添加输入框,输入框放在窗体南侧
frame.add(InputText,BorderLayout.SOUTH);
//窗体添加聊天框滚动条(包含聊天框)
frame.add(RollPane,BorderLayout.CENTER);
//菜单栏添加菜单"关闭"
menubar.add(menu);
//菜单"操作"添加子菜单"关闭"
menu.add(Close);
Close.addActionListener(this);
InputText.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
try {
Date nowTime=new Date();//时间类
OutputText.append(nowTime.toString()+"\r\nMe:"+InputText.getText()+"\r\n");
out.writeUTF(nowTime.toString()+"\r\nHim/Her:"+InputText.getText()+"\r\n");
OutputText.setSelectionStart(OutputText.getText().length());
OutputText.setSelectionEnd(OutputText.getText().length());
InputText.setText(null);
} catch (IOException e1) {}
}
});
}//setframe
public void run(){
System.out.println("接收方显示窗口");
frame.setVisible(true);
while(true){
try {
String Information=in.readUTF();
OutputText.append(Information);
OutputText.setSelectionStart(OutputText.getText().length());
OutputText.setSelectionEnd(OutputText.getText().length());
if(!isOpening || Information.equals("系统提示:对方退出了聊天框。")){
return;
}//if
}//try
catch (IOException e) {}
}//while
}//run
public void actionPerformed(ActionEvent e) {
try {
out.writeUTF("系统提示:对方退出了聊天框。");
isOpening=false;
}//try
catch (IOException e1) {}
frame.setVisible(false);
}//actionPerformed
@Override
public void windowActivated(WindowEvent arg0) {
//System.out.println(1);
}
@Override
public void windowClosed(WindowEvent arg0) {
//System.out.println(2);
}
@Override
public void windowClosing(WindowEvent arg0) {
try {
out.writeUTF("系统提示:对方退出了聊天框。");
isOpening=false;
} catch (IOException e1) {}
}
@Override
public void windowDeactivated(WindowEvent arg0) {
//System.out.println(4);
}
@Override
public void windowDeiconified(WindowEvent arg0) {
//System.out.println(5);
}
@Override
public void windowIconified(WindowEvent arg0) {
//System.out.println(6);
}
@Override
public void windowOpened(WindowEvent arg0) {
//System.out.println(7);
}
}
class Communication extends Thread implements ActionListener,WindowListener{
private Socket server;
private JFrame frame;
private DataInputStream in;
private DataOutputStream out;
private JTextField InputText;
private JTextArea OutputText;
private boolean isOpening;
private boolean Accept;
Communication(JFrame frame,int port){
//给本机传输文件
this.frame=frame;
isOpening=true;
Accept=false;
try {
System.out.println("建立与其它文件传输软件的连接");
//InetAddress.getLocalHost()获取本机的IP地址
server=new Socket(InetAddress.getLocalHost(),port);
server.setSoTimeout(60000);//设置超时时间为一分钟
//建立网络输入输出流,用于发送各种各样的信息(非文件)
in=new DataInputStream(server.getInputStream());
out=new DataOutputStream(server.getOutputStream());
Accept=true;
System.out.println("向对方发出发起聊天的指令");
out.writeUTF("发起聊天");
if(in.readBoolean()){
System.out.println("对方同意,建立窗口");
setFrame();
start();
}
} catch (IOException e1) {
if(Accept){JOptionPane.showMessageDialog(frame,"对方接受超时","错误",JOptionPane.ERROR_MESSAGE);}
else {JOptionPane.showMessageDialog(frame,"无法与对方连接,或者请检查IP地址和端口是否有输错,或者网络已断开","错误",JOptionPane.ERROR_MESSAGE);}
}
}//Communication
Communication(JFrame frame,int port,String IP){
//给本机传输文件
this.frame=frame;
isOpening=true;
Accept=false;
try {
System.out.println("建立与其它文件传输软件的连接");
//InetAddress.getLocalHost()获取本机的IP地址
server=new Socket(IP,port);
server.setSoTimeout(60000);//设置超时时间为一分钟
//建立网络输入输出流,用于发送各种各样的信息(非文件)
in=new DataInputStream(server.getInputStream());
out=new DataOutputStream(server.getOutputStream());
Accept=true;
out.writeUTF("发起聊天");
if(in.readBoolean()){
setFrame();
start();
}
} catch (IOException e1) {
if(Accept){JOptionPane.showMessageDialog(frame,"对方接受超时","错误",JOptionPane.ERROR_MESSAGE);}
else {JOptionPane.showMessageDialog(frame,"无法与对方连接,或者请检查IP地址和端口是否有输错,或者网络已断开","错误",JOptionPane.ERROR_MESSAGE);}
}
}//Communication
public void run(){
frame.setVisible(true);
while(true){
try {
String Information=in.readUTF();
OutputText.append(Information);
OutputText.setSelectionStart(OutputText.getText().length());
OutputText.setSelectionEnd(OutputText.getText().length());
if(isOpening && Information.equals("系统提示:对方退出了聊天框。")){
return;
}//if
} catch (IOException e) {}
}//while
}
public void setFrame(){
//创建并设置窗体
frame=new JFrame("聊天工具");
//添加WindowListener事件
frame.addWindowListener(this);
//创建并设置菜单栏
JMenuBar menubar=new JMenuBar();
//创建并设置菜单"文件"
JMenu menu=new JMenu("操作");
//创建并设置子菜单"关闭"
JMenuItem Close=new JMenuItem("关闭");
//创建输入框
InputText=new JTextField();
//创建聊天框
OutputText=new JTextArea();
//设置聊天框滚动条
JScrollPane RollPane=new JScrollPane(OutputText);
//聊天框设置不可修改
OutputText.setEditable(false);
//设置聊天框大小
RollPane.setPreferredSize(new Dimension(250,100));
//聊天框设置自动换行
OutputText.setLineWrap(true);
//窗体关闭时退出程序
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
//设置窗口大小
frame.setSize(500,400);
//设置窗口位置
frame.setLocation(250,250);
//是否可见
frame.setVisible(true);
//是否可改变大小
frame.setResizable(true);
//显示窗体
frame.setVisible(true);
//窗体添加菜单栏,菜单栏放在窗体北侧
frame.add(menubar,BorderLayout.NORTH);
//窗体添加输入框,输入框放在窗体南侧
frame.add(InputText,BorderLayout.SOUTH);
//窗体添加聊天框滚动条(包含聊天框)
frame.add(RollPane,BorderLayout.CENTER);
//菜单栏添加菜单"关闭"
menubar.add(menu);
//菜单"操作"添加子菜单"关闭"
menu.add(Close);
Close.addActionListener(this);
InputText.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
try {
Date nowTime=new Date();//时间类
OutputText.append(nowTime.toString()+"\r\nMe:"+InputText.getText()+"\r\n");
out.writeUTF(nowTime.toString()+"\r\nHim/Her:"+InputText.getText()+"\r\n");
OutputText.setSelectionStart(OutputText.getText().length());
OutputText.setSelectionEnd(OutputText.getText().length());
InputText.setText(null);
} catch (IOException e1) {}
}
});
}
public void actionPerformed(ActionEvent e) {
try {
out.writeUTF("系统提示:对方退出了聊天框。");
isOpening=false;
} catch (IOException e1) {}
frame.setVisible(false);
}
@Override
public void windowActivated(WindowEvent arg0) {
//System.out.println(1);
}
@Override
public void windowClosed(WindowEvent arg0) {
//System.out.println(2);
}
@Override
public void windowClosing(WindowEvent arg0) {
try {
out.writeUTF("系统提示:对方退出了聊天框。");
isOpening=false;
} catch (IOException e1) {}
}
@Override
public void windowDeactivated(WindowEvent arg0) {
//System.out.println(4);
}
@Override
public void windowDeiconified(WindowEvent arg0) {
//System.out.println(5);
}
@Override
public void windowIconified(WindowEvent arg0) {
//System.out.println(6);
}
@Override
public void windowOpened(WindowEvent arg0) {
//System.out.println(7);
}
}
class Accept_File extends Thread implements ActionListener{
private Socket client;
private String FileName;//文件名字
private String FileDirectory;//设置文件路径
private String FilePath;
private int FileBytesSize;//文字总字节数
private JProgressBar PB;//进度条
private JFrame frame;//窗口
private JButton pause;
private JLabel PIC;//显示文件的图标和名字
private JLabel Byte_NUM;//显示文件字节数
private Box boxV;//把所有组件打包成一个箱子
private boolean isCancel;//如果按了取消键
private boolean isPause;//如果按了暂停键
private InputStream _in;
private DataInputStream in;
private DataOutputStream out;
Accept_File(JFrame frame,Socket client) throws IOException{
this.frame=frame;
this.client=client;
//构造网络输入输出流
in=new DataInputStream(client.getInputStream());
out=new DataOutputStream(client.getOutputStream());
//接收文件
InputStream netIn=client.getInputStream();
_in=new DataInputStream(new BufferedInputStream(netIn));
start();
}
public void run(){
try {
//每次server.accept()和new server(IP,post)后只能传输一次文件
while(true){
System.out.println("本机接收对方发送过来的文件名字");
FileName=in.readUTF();
renew();
System.out.println(FileName);
if(acceptInformation()){
FileAccept();
pause.setText("打开文件所在的位置");
break;
}//if
}//while
} catch (IOException e) {System.out.println("无法获取文本文件");}
}//run
public void FileAccept(){
try{
System.out.println("获取文件大小");
//获取文件大小
int FileBytesSize=this.in.readInt();
System.out.println(FileBytesSize+"文件大小获得");
//使用本地文件系统接受网络数据并存为新文件
File file=new File(FileDirectory+FileName);
file.createNewFile();
RandomAccessFile raf=new RandomAccessFile(file,"rw");
//创建一个byte数组作为文件读取缓冲流
byte[] buf=new byte[2048];
System.out.println("开始读取文件");
//开始读取文件
int sum=0;
int s=_in.read(buf);//读取2048长度的数据,s返回这段数据的长度,如果文件剩余数据不足2048,s<2048
while(s!=-1){//s为-1表示文件已经没有可以再次读取的数据了。
//按钮事件
if(isPause){
try {hangUP();} //按下暂停键的时候线程停在这里
catch (Exception e)
{e.printStackTrace();}
}//if
if(isCancel){
return;//按下取消键的时候线程终止
}//if
raf.write(buf,0,s);//将数据写往文件
sum+=s;
if(FileBytesSize>=1000000){
Byte_NUM.setText(sum/1000000+"/"+FileBytesSize/1000000+"MB"); //标签:文件大小(以MB来计算)
}
else if(FileBytesSize>=1000){
Byte_NUM.setText(sum/1000+"/"+FileBytesSize/1000+"KB"); //标签:文件大小(以KB来计算)
}
else{
Byte_NUM.setText(sum+"/"+FileBytesSize+"Byte"); //标签:文件大小(以Byte来计算)
}
PB.setValue((int)(((double)sum/(double)FileBytesSize)*100)); //进度条:显示进度
//System.out.println((int)(((double)sum/(double)FileBytesSize)*100));
s=_in.read(buf);
}//while
System.out.println("关闭");
//关闭
raf.close();
_in.close();
client.close();
}//try
catch(IOException e2){
if(e2.getMessage().equals("Connection reset by peer: socket write error")){
JOptionPane.showMessageDialog(frame, "本机网络中断","错误",JOptionPane.ERROR_MESSAGE);
}//if
else if(e2.getMessage().equals("Read timed out")){
JOptionPane.showMessageDialog(frame, "对方网络中断或取消了发送","错误",JOptionPane.ERROR_MESSAGE);
}//else if
}//catch
}//FileAccept
public boolean acceptInformation(){
boolean choice=false;
try {
while(true){
System.out.println("是否接受文件");
if(JOptionPane.showConfirmDialog(frame, "对方要求向您发送文件 "+FileName+" 您是否接受?")==0){
System.out.println("发送true给对方");
choice=true;
if(ChooseDirectory()){
PIC.setText(FileName);
frame.add(boxV);
frame.pack();
break;
}//if
}//if
else{
System.out.println("发送false给对方");
choice=false;
break;
}//else
}//while
out.writeBoolean(choice);
return choice;
}//try
catch (IOException e) {}
return choice;
}//acceptInformation
public boolean ChooseDirectory(){
JFileChooser JFC=new JFileChooser("D:\\");
JFC.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int s=JFC.showOpenDialog(JFC);
if(s==0){
FilePath=JFC.getSelectedFile().getAbsolutePath();
FileDirectory=FilePath+"\\";
return true;
}
else {
return false;
}//else
}//ChooseDirectory
public void renew(){
isCancel=false;
isPause=false;
//创造一个横向的箱子
boxV=Box.createHorizontalBox();
PIC=new JLabel();
PIC.setBounds(new Rectangle(100,100));
boxV.add(PIC);
//进度条
PB=new JProgressBar(0,100);
PB.setStringPainted(true);
boxV.add(PB);
//字节数
Byte_NUM=new JLabel("0/"+String.valueOf(FileBytesSize));
boxV.add(Byte_NUM);
//暂停按钮
pause=new JButton("暂停");
boxV.add(pause);
pause.addActionListener(this);
//取消按钮
JButton cancel=new JButton("取消");
boxV.add(cancel);
cancel.addActionListener(this);
//刷新一下
frame.setVisible(false);
frame.setVisible(true);
}//renew
public void actionPerformed(ActionEvent e) {
if(((JButton)e.getSource()).getText()=="取消"){
isCancel=true;//按下取消键的时候终止线程
boxV.setVisible(false);
try {
this.out.write(-1);
} catch (IOException e1) {
}
}
else if(((JButton)e.getSource()).getText()=="暂停"){
isPause=true;//按下暂停键的时候暂停线程。
((JButton)e.getSource()).setText("继续");
}
else if(((JButton)e.getSource()).getText()=="继续"){
isPause=false;
restart();//按下继续键的时候继续执行线程
((JButton)e.getSource()).setText("暂停");
}
else if(((JButton)e.getSource()).getText()=="打开文件所在的位置"){
try{
String[] cmd = new String[5];
String url = FilePath;
cmd[0] = "cmd";
cmd[1] = "/c";
cmd[2] = "start";
cmd[3] = " ";
cmd[4] = url;
Runtime.getRuntime().exec(cmd);
} catch (IOException e1) {}
}//if “打开文件所在的位置”
}
private synchronized void hangUP()throws InterruptedException{
wait();
}
private synchronized void restart(){
notifyAll();
}
}
class Delivery_File extends Thread implements ActionListener{
private JFrame frame;//窗口
private Socket server;
private DataInputStream in;
private DataOutputStream out;
private String FileName;//文件名字
private int FileBytesSize;//文字总字节数
private File file;//文件
private boolean isCancel;//如果按了取消键
private boolean isPause;//如果按了暂停键
private Box boxV;//把所有组件打包成一个箱子
private JLabel Byte_NUM;//显示文件字节数
private JProgressBar PB;//进度条
private JLabel PIC;//显示文件的图标和名字
private JButton Delivery;//发送按钮
private JButton Cancel;//取消按钮
private Icon icon;//图标
private OutputStream netOut;
private OutputStream doc;
Delivery_File(int port,JFrame frame){
//给本机传输文件
this.frame=frame;
try {
System.out.println("建立与其它文件传输软件的连接");
//InetAddress.getLocalHost()获取本机的IP地址
server=new Socket(InetAddress.getLocalHost(),port);
//建立网络输入输出流,用于发送各种各样的信息(非文件)
in=new DataInputStream(server.getInputStream());
out=new DataOutputStream(server.getOutputStream());
//建立一个网络输入输出缓冲流,用于发送文件
netOut=server.getOutputStream();
doc=new DataOutputStream(new BufferedOutputStream(netOut));
out.writeUTF("传送文件");
ChooseFile();
if(FileName!=null){
SetABox();
}//if
} catch (IOException e1) {JOptionPane.showMessageDialog(frame,"无法与对方连接,请检查IP地址和端口是否有输错,或者网络已断开","错误",JOptionPane.ERROR_MESSAGE);}
}//Delivery_File
Delivery_File(int port,JFrame frame,String IP){
//给其它电脑传输文件
this.frame=frame;
try {
System.out.println("建立与其它文件传输软件的连接");
//IP:对方的IP
server=new Socket(IP,port);
//建立网络输入输出流,用于发送各种各样的信息(非文件)
in=new DataInputStream(server.getInputStream());
out=new DataOutputStream(server.getOutputStream());
//建立一个网络输入输出缓冲流,用于发送文件
netOut=server.getOutputStream();
doc=new DataOutputStream(new BufferedOutputStream(netOut));
out.writeUTF("传送文件");
ChooseFile();
if(FileName!=null){
SetABox();
}//if
} catch (IOException e1) {JOptionPane.showMessageDialog(frame,"无法与对方连接,请检查IP地址和端口是否有输错,或者网络已断开","错误",JOptionPane.ERROR_MESSAGE);}
}//Delivery_File
public void SetABox(){
isCancel=false;
isPause=false;
try {
//获取文件的字节大小
InputStream IS=new FileInputStream(file);
FileBytesSize=IS.available();
} catch (Exception e1) {}
//获取图标
FileSystemView view=FileSystemView.getFileSystemView();
icon=view.getSystemIcon(file);
//创造一个横向的箱子
boxV=Box.createHorizontalBox();
PIC=new JLabel(FileName);
PIC.setBounds(new Rectangle(100,100));
PIC.setIcon(icon);
boxV.add(PIC);
//进度条
PB=new JProgressBar(0,100);
PB.setStringPainted(true);
boxV.add(PB);
//字节数
Byte_NUM=new JLabel("0/"+String.valueOf(FileBytesSize)+"Byte");
boxV.add(Byte_NUM);
//发送按钮
Delivery=new JButton("发送");
Delivery.addActionListener(this);
boxV.add(Delivery);
//取消按钮
Cancel=new JButton("取消");
boxV.add(Cancel);
Cancel.addActionListener(this);
frame.add(boxV);
//刷新一下
frame.setVisible(false);
frame.setVisible(true);
frame.pack();//把窗口按组件大小变换合适的大小
}
public void ChooseFile(){
FileDialog filedialog=new FileDialog(frame,"打开",FileDialog.LOAD);
filedialog.setVisible(true);
if(filedialog.getDirectory()==null)return;//按取消的时候
String FileDirectory=filedialog.getDirectory();//获取文件路径 D:\Backup\桌面\
//String FileName=filedialog.getName();//filedlg0
FileName=filedialog.getFile();//获取文件名字 XXX.XXX
System.out.println(1+" "+FileName);
String Path=FileDirectory+FileName;//获取路径
file=new File(Path);
}//ChooseFile()
public void DeliveryFile(){
int sum=0;//变量sum用于计算已经传输了多少字节
int s;
try {
System.out.println("给对方发送文件名字");
//向对方发送文件名字
out.writeUTF(FileName);
System.out.println("对方接收成功");
System.out.println("看对方是否接收文件");
//询问对方是否同意接受文件
if(in.readBoolean()){//-----------------------------------------------------
System.out.println("对方接收文件,向对方发送文件字节大小");
//向对方发送文件大小
out.writeInt(FileBytesSize);
//创建文件输入流
FileInputStream in=new FileInputStream(file);
System.out.println("开始传输文件");
//创建一个byte数组作为文件读取缓冲流
byte[] buf=new byte[2048];
s=in.read(buf);//从文件读取2048长度的数据,s返回这段数据的长度,如果文件剩余数据不足2048,s<2048
while(s!=-1){//s为-1表示文件已经没有可以再次读取的数据了。
//按钮事件
if(isPause){
try {hangUP();}
catch (Exception e) {e.printStackTrace();}//按下暂停键的时候线程停在这里
}//if
if(isCancel){
return;//按下取消键的时候线程终止}
}//if
//文件传输
doc.write(buf,0,s);
doc.flush();
//显示传输进度
sum+=s; //sum:当前已读的字节大小
if(FileBytesSize>=1000000){
Byte_NUM.setText(sum/1000000+"/"+FileBytesSize/1000000+" MB"); //标签:文件大小(以MB来计算)
}//if
else if(FileBytesSize>=1000){
Byte_NUM.setText(sum/1000+"/"+FileBytesSize/1000+" KB"); //标签:文件大小(以KB来计算)
}//else if
else{
Byte_NUM.setText(sum+"/"+FileBytesSize+" Byte"); //标签:文件大小(以Byte来计算)
}//else
PB.setValue((int)(((double)sum/(double)FileBytesSize)*100)); //进度条:显示进度
s=in.read(buf);
}//while
System.out.println("关闭");
in.close();
doc.close();
out.close();
server.close();
System.out.println("传输完成!");
}//if
else JOptionPane.showMessageDialog(frame, "对方拒绝接受文件","警告",JOptionPane.ERROR_MESSAGE);
}//try
catch (IOException e) {
if(e.getMessage().equals("Connection reset by peer: socket write error")){
JOptionPane.showMessageDialog(frame, "本机网络中断","错误",JOptionPane.ERROR_MESSAGE);
}//if
else if(e.getMessage().equals("Read timed out")){
JOptionPane.showMessageDialog(frame, "对方网络中断或取消了发送","错误",JOptionPane.ERROR_MESSAGE);
}//else if
}
boxV.setVisible(false);
}//DeliveryFile()
public void run(){
DeliveryFile();
}//run
public void actionPerformed(ActionEvent e) {
if(((JButton)e.getSource()).getText()=="发送"){
System.out.println("按下发送键");
start();//按下发送键的时候启动线程
((JButton)e.getSource()).setText("暂停");
}//if
else if(((JButton)e.getSource()).getText()=="取消"){
System.out.println("按下取消键");
isCancel=true;//按下取消键的时候终止线程
boxV.setVisible(false);
}//else if
else if(((JButton)e.getSource()).getText()=="暂停"){
System.out.println("按下暂停键");
isPause=true;//按下暂停键的时候暂停线程。
((JButton)e.getSource()).setText("继续");
}//else if
else if(((JButton)e.getSource()).getText()=="继续"){
System.out.println("按下继续键");
isPause=false;
restart();//按下继续键的时候继续执行线程
((JButton)e.getSource()).setText("暂停");
}//else if
}//actionPerformed
private synchronized void hangUP()throws InterruptedException{
wait();
}//hangUP
private synchronized void restart(){
notifyAll();
}//restart
}//Delivery_File
class ViewOfFileTransfer extends Thread implements ActionListener{
private JFrame frame;//文件传输软件窗口
private JFrame showIP_frame;//显示本机IP地址的窗口
private JFrame setIP_frame;//设置IP地址的窗口
private JFrame About_frame;//"关于"的窗口
private JMenuItem showport;//显示端口
private JMenuItem Communicate;//发起聊天
private JMenuItem DeliveryFile;//发送文件
private JMenuItem setIP;//设置IP地址的菜单子项
private JMenuItem showIP;//显示本机的IP地址
private JMenuItem About;//关于
private ServerSocket server;
private int port;//端口号
private int port1;//自己的端口号
private String IP;//IP地址
private boolean isLocalPC;//为true则选择的是本机
private boolean First;//用于在设置IP地址的时候,控制文本框只有第一次点击时候才会清空
private JTextField JTF;//设置IP地址的窗口里的文本框
ViewOfFileTransfer(){
System.out.println("建立窗口");
//首先建立文件传输软件的窗口
frame=new JFrame("文件传输");
frame.setBounds(343,71,480,284);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//窗口设置BoxLayout布局
frame.setLayout(new BoxLayout(frame.getContentPane(),BoxLayout.Y_AXIS));
//建立菜单栏
JMenuBar MMenu=new JMenuBar();
//建立菜单项“操作”
JMenu File=new JMenu("操作");
JMenu Help=new JMenu("帮助");
//菜单子项初始化
showport=new JMenuItem("显示端口");
Communicate=new JMenuItem("发起聊天");
DeliveryFile=new JMenuItem("发送文件");
setIP=new JMenuItem("设置连接指向");
showIP=new JMenuItem("显示IP地址");
About=new JMenuItem("关于");
//菜单子项添加事件
showport.addActionListener(this);
Communicate.addActionListener(this);
DeliveryFile.addActionListener(this);
setIP.addActionListener(this);
showIP.addActionListener(this);
About.addActionListener(this);
//菜单项添加菜单子项
File.add(showport);
File.add(DeliveryFile);
File.add(Communicate);
File.add(setIP);
File.add(showIP);
Help.add(About);
//窗口添加菜单栏,菜单栏添加菜单
MMenu.add(File);
MMenu.add(Help);
frame.setJMenuBar(MMenu);
//窗口显示
frame.setVisible(true);
//输入端口号
boolean Input=true;
while(Input){
String str=JOptionPane.showInputDialog(frame,"请输入端口号");
if(str!=null && str.matches("[0-9]+")){
int port=Integer.parseInt(str);
if(port>1024&&port<=65535){
Input=false;
this.port1=port;
try{
server=new ServerSocket(port);
/* //设置连接超时时间是30秒钟
server.setSoTimeout(30000);*/
}//try
catch(IOException e1){}
}//if
else{
JOptionPane.showMessageDialog(frame, "您输入了非法端口","警告",JOptionPane.WARNING_MESSAGE);
}//else
}//if
else{
JOptionPane.showMessageDialog(frame, "您输入了非数字序列","警告",JOptionPane.WARNING_MESSAGE);
}//else
}//while
//连接对象默认为本机
isLocalPC=true;
//建立各种窗口
setIP_JFrame();
setshowIP_frame();
//启动线程,接受来自其它传输软件的连接
start();
//输入对方的端口号
Input=true;
while(Input){
String str=JOptionPane.showInputDialog(frame,"请输入对方的端口号");
if(str!=null && str.matches("[0-9]+")){
int port=Integer.parseInt(str);
if(port>1024&&port<=65535){
Input=false;
this.port=port;
}//if
else{
JOptionPane.showMessageDialog(frame, "您输入了非法端口","警告",JOptionPane.WARNING_MESSAGE);
}//else
}//if
else{
JOptionPane.showMessageDialog(frame, "您输入了非数字序列","警告",JOptionPane.WARNING_MESSAGE);
}//else
}//while
set_AboutMenu();
}//ViewOfFileTransfer
public void run(){
//循环,对方按下发送文件的时候接受到信息,然后启动接收文件的线程
while(true){
try {
System.out.println("等待另一个文件传输软件来连接");
//等待另一个文件传输软件来连接
Socket client=server.accept();
DataInputStream in=new DataInputStream(client.getInputStream());
String choice=in.readUTF();
client.setSoTimeout(60000);//设置连接超时时间是一分钟
//有另一个文件传输软件点击了发送文件
System.out.println("与某个文件传输软件建立联系"+choice);
if(choice.equals("传送文件")){
//建立接收文件线程
System.out.println("传送文件");
new Accept_File(frame,client);
}
else if(choice.equals("发起聊天")){
if((JOptionPane.showConfirmDialog(frame,"对方向您发起聊天,您是否接受"))==0){
System.out.println("接受聊天邀请");
new Accept_Communication(client);
}else{
System.out.println("拒绝聊天邀请");
DataOutputStream out=new DataOutputStream(client.getOutputStream());
out.writeBoolean(false);
}
}
}//try
catch(IOException e2){System.out.println("连接超时!");}
}//while
}//run
public void setshowIP_frame(){
showIP_frame=new JFrame("显示本机的IP地址");
showIP_frame.setBounds(474,233,327,70);
showIP_frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
showIP_frame.setLayout(new FlowLayout());
JLabel label=new JLabel("您的IP地址是:");
showIP_frame.add(label);
try {
String s=InetAddress.getLocalHost().toString();
s=s.replaceAll(".+/", "");
JTextField JTF=new JTextField(s);
JTF.setEditable(false);
showIP_frame.add(JTF);
} catch (UnknownHostException e) {}
}
public void set_AboutMenu(){
About_frame=new JFrame("关于");
About_frame.setLayout(null);
About_frame.setBounds(465,251,358,173);
JLabel label=new JLabel("<html><br><img width=100 height=100 src=\"http://www.iconpng.com/png/windows-8-metro-invert/computer.png\"></br></html>");
label.setBounds(10,10,100,120);
JLabel author=new JLabel("By @author wuwave");
author.setBounds(153,47,200,20);
JLabel useTime=new JLabel("所用时间:");
useTime.setBounds(153,70,200,20);
useTime.setFont(new Font("新宋体",Font.BOLD,15));
JLabel time=new JLabel("2014.12.13-2014.12.18");
time.setFont(new Font("新宋体",Font.BOLD,15));
time.setBounds(153,90,200,20);
About_frame.add(label);
About_frame.add(author);
About_frame.add(useTime);
About_frame.add(time);
About_frame.setResizable(false);
}
public void setIP_JFrame(){
//新建IP地址设置窗口
First=true;
setIP_frame=new JFrame("设置所要连接的对象");
setIP_frame.setBounds(474,233,320,67);
setIP_frame.setLayout(new FlowLayout());
setIP_frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
ButtonGroup JCPG=new ButtonGroup();
JRadioButton JCB1=new JRadioButton("本机");
JRadioButton JCB2=new JRadioButton("其它电脑");
JTF=new JTextField(12);
JTF.setText("请输入其它电脑的IP地址");
JTF.setEnabled(false);
JCPG.add(JCB1);
JCPG.add(JCB2);
JCPG.setSelected(JCB1.getModel(), true);
setIP_frame.add(JCB1);
setIP_frame.add(JCB2);
setIP_frame.add(JTF);
JCB1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
//点击的如果是本机令isLocalPC为true,然后文本框不可输入
isLocalPC=true;
JTF.setEnabled(false);
}
});
JCB2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
//点击的如果是其它电脑令isLocalPC为false,然后文本框可以输入
isLocalPC=false;
JTF.setEnabled(true);
}
});
JTF.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e) {
if(First){
JTF.setText(null);
First=false;
}
}//mouseClicked
@Override
public void mouseEntered(MouseEvent e) {
//System.out.println(2);
}
@Override
public void mouseExited(MouseEvent e) {
//System.out.println(3);
}
@Override
public void mousePressed(MouseEvent e) {
// System.out.println(4);
}
@Override
public void mouseReleased(MouseEvent e) {
// System.out.println(5);
}
});
JTF.addCaretListener(new CaretListener(){
public void caretUpdate(CaretEvent e) {
//将文本框填写的IP地址赋给变量IP
IP=((JTextField)e.getSource()).getText();
}//caretUpdate
});
}//setIP_JFrame
public void actionPerformed(ActionEvent e){
if(e.getSource()==showport){
//按下显示端口的菜单子项
//查看该文件传输软件所设置的端口
JOptionPane.showMessageDialog(frame, "您设置的端口号是"+port1);
}//if
else if(e.getSource()==DeliveryFile){
//按下发送文件
//根据设置的是本机还是其它电脑建立发送文件线程
System.out.println("与另一个文件传输软件连接");
if(port!=0){
//根据设置的是本机还是其它电脑的IP设置发送文件线程
if(isLocalPC){
System.out.println("向本机发送文件");
new Delivery_File(port,frame);
}//if
else{
System.out.println("向对方发送文件");
new Delivery_File(port,frame,IP);
}//else
}//if
else{
JOptionPane.showMessageDialog(frame, "请先输入端口号");
}//else
}//else if
else if(e.getSource()==setIP){
//显示设置IP的窗口
setIP_frame.setVisible(true);
}//else if
else if(e.getSource()==showIP){
//显示设置IP的窗口
showIP_frame.setVisible(true);
}//else if
else if(e.getSource()==About){
About_frame.setVisible(true);
}//else if
else if(e.getSource()==Communicate){
System.out.println("发起聊天");
if(port!=0){
//根据设置的是本机还是其它电脑的IP设置发送文件线程
if(isLocalPC){
System.out.println("向本机发起聊天");
new Communication(frame,port);
}//if
else{
System.out.println("向对方发起聊天");
new Communication(frame,port,IP);
}//else
}//if
else{
JOptionPane.showMessageDialog(frame, "请先输入端口号");
}//else
}//if(Communicate)
}//actionPerformed
}
文件传输窗口菜单栏:
“操作菜单栏”
1.显示端口
2.发送文件
3.发起聊天
4.设置连接指向
5.显示IP地址
Socket server=new ServerSocket(port).accept(); ———————————————— Socket client=new Socket(ip,port);
DataInputStream in=new DataInputStream(server.getInputStream); DataOutputStream out=new DataOutputStream(client.getInputStream);
DataOutputStream out=new DataOutputStream(server.getInputStream); DataInputStream in=new DataInputStream(client.getInputStream);
out.writeXXX(XXX) ; → in.readXXX(XXX);
in.readXXX(XXX); ← out.writeXXX(XXX) ;
文件传输窗口菜单栏:
“操作菜单栏”
1.显示端口
2.发送文件
3.发起聊天
4.设置连接指向
5.显示IP地址
打开第一个网络传输软件
设置这台电脑的端口号
输入对方电脑的端口号
打开第二个网络传输软件,重复以上步骤
然后有两个传输软件
如果要连接其它电脑则让对方点击显示IP地址然后把IP地址告诉这边,然后点击设置连接指向设置对方的IP地址即可。
重新设置回本机
其中一个点击发送文件
弹出选择文件窗口
选择文件后
点击发送按钮
选择是,弹框选择保存路径
传送中…
传送完成
点击打开文件所在的位置按钮
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FileDialog;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Date;
import javax.swing.*;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.filechooser.FileSystemView;
public class FileTransfer {
public static void main(String args[]){
javax.swing.SwingUtilities.invokeLater(new Runnable(){
public void run(){
new ViewOfFileTransfer();
}//run
});
}//main
}//FileTransfer
class Accept_Communication extends Thread implements ActionListener, WindowListener{
private JFrame frame;
private DataInputStream in;
private DataOutputStream out;
private JTextField InputText;
private JTextArea OutputText;
private boolean isOpening;
Accept_Communication(Socket client) throws IOException{
//构造网络输入输出流
in=new DataInputStream(client.getInputStream());
out=new DataOutputStream(client.getOutputStream());
System.out.println("向对方发送true");
out.writeBoolean(true);
setFrame();
isOpening=true;
start();
}
public void setFrame(){
//创建并设置窗体
frame=new JFrame("聊天工具");
//添加WindowListener事件
frame.addWindowListener(this);
//创建并设置菜单栏
JMenuBar menubar=new JMenuBar();
//创建并设置菜单"文件"
JMenu menu=new JMenu("操作");
//创建并设置子菜单"关闭"
JMenuItem Close=new JMenuItem("关闭");
//创建输入框
InputText=new JTextField();
//创建聊天框
OutputText=new JTextArea();
//设置聊天框滚动条
JScrollPane RollPane=new JScrollPane(OutputText);
//聊天框设置不可修改
OutputText.setEditable(false);
//设置聊天框大小
RollPane.setPreferredSize(new Dimension(250,100));
//聊天框设置自动换行
OutputText.setLineWrap(true);
//窗体关闭时退出程序
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
//设置窗口大小
frame.setSize(500,400);
//设置窗口位置
frame.setLocation(250,250);
//是否可见
frame.setVisible(true);
//是否可改变大小
frame.setResizable(true);
//显示窗体
frame.setVisible(true);
//窗体添加菜单栏,菜单栏放在窗体北侧
frame.add(menubar,BorderLayout.NORTH);
//窗体添加输入框,输入框放在窗体南侧
frame.add(InputText,BorderLayout.SOUTH);
//窗体添加聊天框滚动条(包含聊天框)
frame.add(RollPane,BorderLayout.CENTER);
//菜单栏添加菜单"关闭"
menubar.add(menu);
//菜单"操作"添加子菜单"关闭"
menu.add(Close);
Close.addActionListener(this);
InputText.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
try {
Date nowTime=new Date();//时间类
OutputText.append(nowTime.toString()+"\r\nMe:"+InputText.getText()+"\r\n");
out.writeUTF(nowTime.toString()+"\r\nHim/Her:"+InputText.getText()+"\r\n");
OutputText.setSelectionStart(OutputText.getText().length());
OutputText.setSelectionEnd(OutputText.getText().length());
InputText.setText(null);
} catch (IOException e1) {}
}
});
}//setframe
public void run(){
System.out.println("接收方显示窗口");
frame.setVisible(true);
while(true){
try {
String Information=in.readUTF();
OutputText.append(Information);
OutputText.setSelectionStart(OutputText.getText().length());
OutputText.setSelectionEnd(OutputText.getText().length());
if(!isOpening || Information.equals("系统提示:对方退出了聊天框。")){
return;
}//if
}//try
catch (IOException e) {}
}//while
}//run
public void actionPerformed(ActionEvent e) {
try {
out.writeUTF("系统提示:对方退出了聊天框。");
isOpening=false;
}//try
catch (IOException e1) {}
frame.setVisible(false);
}//actionPerformed
@Override
public void windowActivated(WindowEvent arg0) {
//System.out.println(1);
}
@Override
public void windowClosed(WindowEvent arg0) {
//System.out.println(2);
}
@Override
public void windowClosing(WindowEvent arg0) {
try {
out.writeUTF("系统提示:对方退出了聊天框。");
isOpening=false;
} catch (IOException e1) {}
}
@Override
public void windowDeactivated(WindowEvent arg0) {
//System.out.println(4);
}
@Override
public void windowDeiconified(WindowEvent arg0) {
//System.out.println(5);
}
@Override
public void windowIconified(WindowEvent arg0) {
//System.out.println(6);
}
@Override
public void windowOpened(WindowEvent arg0) {
//System.out.println(7);
}
}
class Communication extends Thread implements ActionListener,WindowListener{
private Socket server;
private JFrame frame;
private DataInputStream in;
private DataOutputStream out;
private JTextField InputText;
private JTextArea OutputText;
private boolean isOpening;
private boolean Accept;
Communication(JFrame frame,int port){
//给本机传输文件
this.frame=frame;
isOpening=true;
Accept=false;
try {
System.out.println("建立与其它文件传输软件的连接");
//InetAddress.getLocalHost()获取本机的IP地址
server=new Socket(InetAddress.getLocalHost(),port);
server.setSoTimeout(60000);//设置超时时间为一分钟
//建立网络输入输出流,用于发送各种各样的信息(非文件)
in=new DataInputStream(server.getInputStream());
out=new DataOutputStream(server.getOutputStream());
Accept=true;
System.out.println("向对方发出发起聊天的指令");
out.writeUTF("发起聊天");
if(in.readBoolean()){
System.out.println("对方同意,建立窗口");
setFrame();
start();
}
} catch (IOException e1) {
if(Accept){JOptionPane.showMessageDialog(frame,"对方接受超时","错误",JOptionPane.ERROR_MESSAGE);}
else {JOptionPane.showMessageDialog(frame,"无法与对方连接,或者请检查IP地址和端口是否有输错,或者网络已断开","错误",JOptionPane.ERROR_MESSAGE);}
}
}//Communication
Communication(JFrame frame,int port,String IP){
//给本机传输文件
this.frame=frame;
isOpening=true;
Accept=false;
try {
System.out.println("建立与其它文件传输软件的连接");
//InetAddress.getLocalHost()获取本机的IP地址
server=new Socket(IP,port);
server.setSoTimeout(60000);//设置超时时间为一分钟
//建立网络输入输出流,用于发送各种各样的信息(非文件)
in=new DataInputStream(server.getInputStream());
out=new DataOutputStream(server.getOutputStream());
Accept=true;
out.writeUTF("发起聊天");
if(in.readBoolean()){
setFrame();
start();
}
} catch (IOException e1) {
if(Accept){JOptionPane.showMessageDialog(frame,"对方接受超时","错误",JOptionPane.ERROR_MESSAGE);}
else {JOptionPane.showMessageDialog(frame,"无法与对方连接,或者请检查IP地址和端口是否有输错,或者网络已断开","错误",JOptionPane.ERROR_MESSAGE);}
}
}//Communication
public void run(){
frame.setVisible(true);
while(true){
try {
String Information=in.readUTF();
OutputText.append(Information);
OutputText.setSelectionStart(OutputText.getText().length());
OutputText.setSelectionEnd(OutputText.getText().length());
if(isOpening && Information.equals("系统提示:对方退出了聊天框。")){
return;
}//if
} catch (IOException e) {}
}//while
}
public void setFrame(){
//创建并设置窗体
frame=new JFrame("聊天工具");
//添加WindowListener事件
frame.addWindowListener(this);
//创建并设置菜单栏
JMenuBar menubar=new JMenuBar();
//创建并设置菜单"文件"
JMenu menu=new JMenu("操作");
//创建并设置子菜单"关闭"
JMenuItem Close=new JMenuItem("关闭");
//创建输入框
InputText=new JTextField();
//创建聊天框
OutputText=new JTextArea();
//设置聊天框滚动条
JScrollPane RollPane=new JScrollPane(OutputText);
//聊天框设置不可修改
OutputText.setEditable(false);
//设置聊天框大小
RollPane.setPreferredSize(new Dimension(250,100));
//聊天框设置自动换行
OutputText.setLineWrap(true);
//窗体关闭时退出程序
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
//设置窗口大小
frame.setSize(500,400);
//设置窗口位置
frame.setLocation(250,250);
//是否可见
frame.setVisible(true);
//是否可改变大小
frame.setResizable(true);
//显示窗体
frame.setVisible(true);
//窗体添加菜单栏,菜单栏放在窗体北侧
frame.add(menubar,BorderLayout.NORTH);
//窗体添加输入框,输入框放在窗体南侧
frame.add(InputText,BorderLayout.SOUTH);
//窗体添加聊天框滚动条(包含聊天框)
frame.add(RollPane,BorderLayout.CENTER);
//菜单栏添加菜单"关闭"
menubar.add(menu);
//菜单"操作"添加子菜单"关闭"
menu.add(Close);
Close.addActionListener(this);
InputText.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
try {
Date nowTime=new Date();//时间类
OutputText.append(nowTime.toString()+"\r\nMe:"+InputText.getText()+"\r\n");
out.writeUTF(nowTime.toString()+"\r\nHim/Her:"+InputText.getText()+"\r\n");
OutputText.setSelectionStart(OutputText.getText().length());
OutputText.setSelectionEnd(OutputText.getText().length());
InputText.setText(null);
} catch (IOException e1) {}
}
});
}
public void actionPerformed(ActionEvent e) {
try {
out.writeUTF("系统提示:对方退出了聊天框。");
isOpening=false;
} catch (IOException e1) {}
frame.setVisible(false);
}
@Override
public void windowActivated(WindowEvent arg0) {
//System.out.println(1);
}
@Override
public void windowClosed(WindowEvent arg0) {
//System.out.println(2);
}
@Override
public void windowClosing(WindowEvent arg0) {
try {
out.writeUTF("系统提示:对方退出了聊天框。");
isOpening=false;
} catch (IOException e1) {}
}
@Override
public void windowDeactivated(WindowEvent arg0) {
//System.out.println(4);
}
@Override
public void windowDeiconified(WindowEvent arg0) {
//System.out.println(5);
}
@Override
public void windowIconified(WindowEvent arg0) {
//System.out.println(6);
}
@Override
public void windowOpened(WindowEvent arg0) {
//System.out.println(7);
}
}
class Accept_File extends Thread implements ActionListener{
private Socket client;
private String FileName;//文件名字
private String FileDirectory;//设置文件路径
private String FilePath;
private int FileBytesSize;//文字总字节数
private JProgressBar PB;//进度条
private JFrame frame;//窗口
private JButton pause;
private JLabel PIC;//显示文件的图标和名字
private JLabel Byte_NUM;//显示文件字节数
private Box boxV;//把所有组件打包成一个箱子
private boolean isCancel;//如果按了取消键
private boolean isPause;//如果按了暂停键
private InputStream _in;
private DataInputStream in;
private DataOutputStream out;
Accept_File(JFrame frame,Socket client) throws IOException{
this.frame=frame;
this.client=client;
//构造网络输入输出流
in=new DataInputStream(client.getInputStream());
out=new DataOutputStream(client.getOutputStream());
//接收文件
InputStream netIn=client.getInputStream();
_in=new DataInputStream(new BufferedInputStream(netIn));
start();
}
public void run(){
try {
//每次server.accept()和new server(IP,post)后只能传输一次文件
while(true){
System.out.println("本机接收对方发送过来的文件名字");
FileName=in.readUTF();
renew();
System.out.println(FileName);
if(acceptInformation()){
FileAccept();
pause.setText("打开文件所在的位置");
break;
}//if
}//while
} catch (IOException e) {System.out.println("无法获取文本文件");}
}//run
public void FileAccept(){
try{
System.out.println("获取文件大小");
//获取文件大小
int FileBytesSize=this.in.readInt();
System.out.println(FileBytesSize+"文件大小获得");
//使用本地文件系统接受网络数据并存为新文件
File file=new File(FileDirectory+FileName);
file.createNewFile();
RandomAccessFile raf=new RandomAccessFile(file,"rw");
//创建一个byte数组作为文件读取缓冲流
byte[] buf=new byte[2048];
System.out.println("开始读取文件");
//开始读取文件
int sum=0;
int s=_in.read(buf);//读取2048长度的数据,s返回这段数据的长度,如果文件剩余数据不足2048,s<2048
while(s!=-1){//s为-1表示文件已经没有可以再次读取的数据了。
//按钮事件
if(isPause){
try {hangUP();} //按下暂停键的时候线程停在这里
catch (Exception e)
{e.printStackTrace();}
}//if
if(isCancel){
return;//按下取消键的时候线程终止
}//if
raf.write(buf,0,s);//将数据写往文件
sum+=s;
if(FileBytesSize>=1000000){
Byte_NUM.setText(sum/1000000+"/"+FileBytesSize/1000000+"MB"); //标签:文件大小(以MB来计算)
}
else if(FileBytesSize>=1000){
Byte_NUM.setText(sum/1000+"/"+FileBytesSize/1000+"KB"); //标签:文件大小(以KB来计算)
}
else{
Byte_NUM.setText(sum+"/"+FileBytesSize+"Byte"); //标签:文件大小(以Byte来计算)
}
PB.setValue((int)(((double)sum/(double)FileBytesSize)*100)); //进度条:显示进度
//System.out.println((int)(((double)sum/(double)FileBytesSize)*100));
s=_in.read(buf);
}//while
System.out.println("关闭");
//关闭
raf.close();
_in.close();
client.close();
}//try
catch(IOException e2){
if(e2.getMessage().equals("Connection reset by peer: socket write error")){
JOptionPane.showMessageDialog(frame, "本机网络中断","错误",JOptionPane.ERROR_MESSAGE);
}//if
else if(e2.getMessage().equals("Read timed out")){
JOptionPane.showMessageDialog(frame, "对方网络中断或取消了发送","错误",JOptionPane.ERROR_MESSAGE);
}//else if
}//catch
}//FileAccept
public boolean acceptInformation(){
boolean choice=false;
try {
while(true){
System.out.println("是否接受文件");
if(JOptionPane.showConfirmDialog(frame, "对方要求向您发送文件 "+FileName+" 您是否接受?")==0){
System.out.println("发送true给对方");
choice=true;
if(ChooseDirectory()){
PIC.setText(FileName);
frame.add(boxV);
frame.pack();
break;
}//if
}//if
else{
System.out.println("发送false给对方");
choice=false;
break;
}//else
}//while
out.writeBoolean(choice);
return choice;
}//try
catch (IOException e) {}
return choice;
}//acceptInformation
public boolean ChooseDirectory(){
JFileChooser JFC=new JFileChooser("D:\\");
JFC.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int s=JFC.showOpenDialog(JFC);
if(s==0){
FilePath=JFC.getSelectedFile().getAbsolutePath();
FileDirectory=FilePath+"\\";
return true;
}
else {
return false;
}//else
}//ChooseDirectory
public void renew(){
isCancel=false;
isPause=false;
//创造一个横向的箱子
boxV=Box.createHorizontalBox();
PIC=new JLabel();
PIC.setBounds(new Rectangle(100,100));
boxV.add(PIC);
//进度条
PB=new JProgressBar(0,100);
PB.setStringPainted(true);
boxV.add(PB);
//字节数
Byte_NUM=new JLabel("0/"+String.valueOf(FileBytesSize));
boxV.add(Byte_NUM);
//暂停按钮
pause=new JButton("暂停");
boxV.add(pause);
pause.addActionListener(this);
//取消按钮
JButton cancel=new JButton("取消");
boxV.add(cancel);
cancel.addActionListener(this);
//刷新一下
frame.setVisible(false);
frame.setVisible(true);
}//renew
public void actionPerformed(ActionEvent e) {
if(((JButton)e.getSource()).getText()=="取消"){
isCancel=true;//按下取消键的时候终止线程
boxV.setVisible(false);
try {
this.out.write(-1);
} catch (IOException e1) {
}
}
else if(((JButton)e.getSource()).getText()=="暂停"){
isPause=true;//按下暂停键的时候暂停线程。
((JButton)e.getSource()).setText("继续");
}
else if(((JButton)e.getSource()).getText()=="继续"){
isPause=false;
restart();//按下继续键的时候继续执行线程
((JButton)e.getSource()).setText("暂停");
}
else if(((JButton)e.getSource()).getText()=="打开文件所在的位置"){
try{
String[] cmd = new String[5];
String url = FilePath;
cmd[0] = "cmd";
cmd[1] = "/c";
cmd[2] = "start";
cmd[3] = " ";
cmd[4] = url;
Runtime.getRuntime().exec(cmd);
} catch (IOException e1) {}
}//if “打开文件所在的位置”
}
private synchronized void hangUP()throws InterruptedException{
wait();
}
private synchronized void restart(){
notifyAll();
}
}
class Delivery_File extends Thread implements ActionListener{
private JFrame frame;//窗口
private Socket server;
private DataInputStream in;
private DataOutputStream out;
private String FileName;//文件名字
private int FileBytesSize;//文字总字节数
private File file;//文件
private boolean isCancel;//如果按了取消键
private boolean isPause;//如果按了暂停键
private Box boxV;//把所有组件打包成一个箱子
private JLabel Byte_NUM;//显示文件字节数
private JProgressBar PB;//进度条
private JLabel PIC;//显示文件的图标和名字
private JButton Delivery;//发送按钮
private JButton Cancel;//取消按钮
private Icon icon;//图标
private OutputStream netOut;
private OutputStream doc;
Delivery_File(int port,JFrame frame){
//给本机传输文件
this.frame=frame;
try {
System.out.println("建立与其它文件传输软件的连接");
//InetAddress.getLocalHost()获取本机的IP地址
server=new Socket(InetAddress.getLocalHost(),port);
//建立网络输入输出流,用于发送各种各样的信息(非文件)
in=new DataInputStream(server.getInputStream());
out=new DataOutputStream(server.getOutputStream());
//建立一个网络输入输出缓冲流,用于发送文件
netOut=server.getOutputStream();
doc=new DataOutputStream(new BufferedOutputStream(netOut));
out.writeUTF("传送文件");
ChooseFile();
if(FileName!=null){
SetABox();
}//if
} catch (IOException e1) {JOptionPane.showMessageDialog(frame,"无法与对方连接,请检查IP地址和端口是否有输错,或者网络已断开","错误",JOptionPane.ERROR_MESSAGE);}
}//Delivery_File
Delivery_File(int port,JFrame frame,String IP){
//给其它电脑传输文件
this.frame=frame;
try {
System.out.println("建立与其它文件传输软件的连接");
//IP:对方的IP
server=new Socket(IP,port);
//建立网络输入输出流,用于发送各种各样的信息(非文件)
in=new DataInputStream(server.getInputStream());
out=new DataOutputStream(server.getOutputStream());
//建立一个网络输入输出缓冲流,用于发送文件
netOut=server.getOutputStream();
doc=new DataOutputStream(new BufferedOutputStream(netOut));
out.writeUTF("传送文件");
ChooseFile();
if(FileName!=null){
SetABox();
}//if
} catch (IOException e1) {JOptionPane.showMessageDialog(frame,"无法与对方连接,请检查IP地址和端口是否有输错,或者网络已断开","错误",JOptionPane.ERROR_MESSAGE);}
}//Delivery_File
public void SetABox(){
isCancel=false;
isPause=false;
try {
//获取文件的字节大小
InputStream IS=new FileInputStream(file);
FileBytesSize=IS.available();
} catch (Exception e1) {}
//获取图标
FileSystemView view=FileSystemView.getFileSystemView();
icon=view.getSystemIcon(file);
//创造一个横向的箱子
boxV=Box.createHorizontalBox();
PIC=new JLabel(FileName);
PIC.setBounds(new Rectangle(100,100));
PIC.setIcon(icon);
boxV.add(PIC);
//进度条
PB=new JProgressBar(0,100);
PB.setStringPainted(true);
boxV.add(PB);
//字节数
Byte_NUM=new JLabel("0/"+String.valueOf(FileBytesSize)+"Byte");
boxV.add(Byte_NUM);
//发送按钮
Delivery=new JButton("发送");
Delivery.addActionListener(this);
boxV.add(Delivery);
//取消按钮
Cancel=new JButton("取消");
boxV.add(Cancel);
Cancel.addActionListener(this);
frame.add(boxV);
//刷新一下
frame.setVisible(false);
frame.setVisible(true);
frame.pack();//把窗口按组件大小变换合适的大小
}
public void ChooseFile(){
FileDialog filedialog=new FileDialog(frame,"打开",FileDialog.LOAD);
filedialog.setVisible(true);
if(filedialog.getDirectory()==null)return;//按取消的时候
String FileDirectory=filedialog.getDirectory();//获取文件路径 D:\Backup\桌面\
//String FileName=filedialog.getName();//filedlg0
FileName=filedialog.getFile();//获取文件名字 XXX.XXX
System.out.println(1+" "+FileName);
String Path=FileDirectory+FileName;//获取路径
file=new File(Path);
}//ChooseFile()
public void DeliveryFile(){
int sum=0;//变量sum用于计算已经传输了多少字节
int s;
try {
System.out.println("给对方发送文件名字");
//向对方发送文件名字
out.writeUTF(FileName);
System.out.println("对方接收成功");
System.out.println("看对方是否接收文件");
//询问对方是否同意接受文件
if(in.readBoolean()){//-----------------------------------------------------
System.out.println("对方接收文件,向对方发送文件字节大小");
//向对方发送文件大小
out.writeInt(FileBytesSize);
//创建文件输入流
FileInputStream in=new FileInputStream(file);
System.out.println("开始传输文件");
//创建一个byte数组作为文件读取缓冲流
byte[] buf=new byte[2048];
s=in.read(buf);//从文件读取2048长度的数据,s返回这段数据的长度,如果文件剩余数据不足2048,s<2048
while(s!=-1){//s为-1表示文件已经没有可以再次读取的数据了。
//按钮事件
if(isPause){
try {hangUP();}
catch (Exception e) {e.printStackTrace();}//按下暂停键的时候线程停在这里
}//if
if(isCancel){
return;//按下取消键的时候线程终止}
}//if
//文件传输
doc.write(buf,0,s);
doc.flush();
//显示传输进度
sum+=s; //sum:当前已读的字节大小
if(FileBytesSize>=1000000){
Byte_NUM.setText(sum/1000000+"/"+FileBytesSize/1000000+" MB"); //标签:文件大小(以MB来计算)
}//if
else if(FileBytesSize>=1000){
Byte_NUM.setText(sum/1000+"/"+FileBytesSize/1000+" KB"); //标签:文件大小(以KB来计算)
}//else if
else{
Byte_NUM.setText(sum+"/"+FileBytesSize+" Byte"); //标签:文件大小(以Byte来计算)
}//else
PB.setValue((int)(((double)sum/(double)FileBytesSize)*100)); //进度条:显示进度
s=in.read(buf);
}//while
System.out.println("关闭");
in.close();
doc.close();
out.close();
server.close();
System.out.println("传输完成!");
}//if
else JOptionPane.showMessageDialog(frame, "对方拒绝接受文件","警告",JOptionPane.ERROR_MESSAGE);
}//try
catch (IOException e) {
if(e.getMessage().equals("Connection reset by peer: socket write error")){
JOptionPane.showMessageDialog(frame, "本机网络中断","错误",JOptionPane.ERROR_MESSAGE);
}//if
else if(e.getMessage().equals("Read timed out")){
JOptionPane.showMessageDialog(frame, "对方网络中断或取消了发送","错误",JOptionPane.ERROR_MESSAGE);
}//else if
}
boxV.setVisible(false);
}//DeliveryFile()
public void run(){
DeliveryFile();
}//run
public void actionPerformed(ActionEvent e) {
if(((JButton)e.getSource()).getText()=="发送"){
System.out.println("按下发送键");
start();//按下发送键的时候启动线程
((JButton)e.getSource()).setText("暂停");
}//if
else if(((JButton)e.getSource()).getText()=="取消"){
System.out.println("按下取消键");
isCancel=true;//按下取消键的时候终止线程
boxV.setVisible(false);
}//else if
else if(((JButton)e.getSource()).getText()=="暂停"){
System.out.println("按下暂停键");
isPause=true;//按下暂停键的时候暂停线程。
((JButton)e.getSource()).setText("继续");
}//else if
else if(((JButton)e.getSource()).getText()=="继续"){
System.out.println("按下继续键");
isPause=false;
restart();//按下继续键的时候继续执行线程
((JButton)e.getSource()).setText("暂停");
}//else if
}//actionPerformed
private synchronized void hangUP()throws InterruptedException{
wait();
}//hangUP
private synchronized void restart(){
notifyAll();
}//restart
}//Delivery_File
class ViewOfFileTransfer extends Thread implements ActionListener{
private JFrame frame;//文件传输软件窗口
private JFrame showIP_frame;//显示本机IP地址的窗口
private JFrame setIP_frame;//设置IP地址的窗口
private JFrame About_frame;//"关于"的窗口
private JMenuItem showport;//显示端口
private JMenuItem Communicate;//发起聊天
private JMenuItem DeliveryFile;//发送文件
private JMenuItem setIP;//设置IP地址的菜单子项
private JMenuItem showIP;//显示本机的IP地址
private JMenuItem About;//关于
private ServerSocket server;
private int port;//端口号
private int port1;//自己的端口号
private String IP;//IP地址
private boolean isLocalPC;//为true则选择的是本机
private boolean First;//用于在设置IP地址的时候,控制文本框只有第一次点击时候才会清空
private JTextField JTF;//设置IP地址的窗口里的文本框
ViewOfFileTransfer(){
System.out.println("建立窗口");
//首先建立文件传输软件的窗口
frame=new JFrame("文件传输");
frame.setBounds(343,71,480,284);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//窗口设置BoxLayout布局
frame.setLayout(new BoxLayout(frame.getContentPane(),BoxLayout.Y_AXIS));
//建立菜单栏
JMenuBar MMenu=new JMenuBar();
//建立菜单项“操作”
JMenu File=new JMenu("操作");
JMenu Help=new JMenu("帮助");
//菜单子项初始化
showport=new JMenuItem("显示端口");
Communicate=new JMenuItem("发起聊天");
DeliveryFile=new JMenuItem("发送文件");
setIP=new JMenuItem("设置连接指向");
showIP=new JMenuItem("显示IP地址");
About=new JMenuItem("关于");
//菜单子项添加事件
showport.addActionListener(this);
Communicate.addActionListener(this);
DeliveryFile.addActionListener(this);
setIP.addActionListener(this);
showIP.addActionListener(this);
About.addActionListener(this);
//菜单项添加菜单子项
File.add(showport);
File.add(DeliveryFile);
File.add(Communicate);
File.add(setIP);
File.add(showIP);
Help.add(About);
//窗口添加菜单栏,菜单栏添加菜单
MMenu.add(File);
MMenu.add(Help);
frame.setJMenuBar(MMenu);
//窗口显示
frame.setVisible(true);
//输入端口号
boolean Input=true;
while(Input){
String str=JOptionPane.showInputDialog(frame,"请输入端口号");
if(str!=null && str.matches("[0-9]+")){
int port=Integer.parseInt(str);
if(port>1024&&port<=65535){
Input=false;
this.port1=port;
try{
server=new ServerSocket(port);
/* //设置连接超时时间是30秒钟
server.setSoTimeout(30000);*/
}//try
catch(IOException e1){}
}//if
else{
JOptionPane.showMessageDialog(frame, "您输入了非法端口","警告",JOptionPane.WARNING_MESSAGE);
}//else
}//if
else{
JOptionPane.showMessageDialog(frame, "您输入了非数字序列","警告",JOptionPane.WARNING_MESSAGE);
}//else
}//while
//连接对象默认为本机
isLocalPC=true;
//建立各种窗口
setIP_JFrame();
setshowIP_frame();
//启动线程,接受来自其它传输软件的连接
start();
//输入对方的端口号
Input=true;
while(Input){
String str=JOptionPane.showInputDialog(frame,"请输入对方的端口号");
if(str!=null && str.matches("[0-9]+")){
int port=Integer.parseInt(str);
if(port>1024&&port<=65535){
Input=false;
this.port=port;
}//if
else{
JOptionPane.showMessageDialog(frame, "您输入了非法端口","警告",JOptionPane.WARNING_MESSAGE);
}//else
}//if
else{
JOptionPane.showMessageDialog(frame, "您输入了非数字序列","警告",JOptionPane.WARNING_MESSAGE);
}//else
}//while
set_AboutMenu();
}//ViewOfFileTransfer
public void run(){
//循环,对方按下发送文件的时候接受到信息,然后启动接收文件的线程
while(true){
try {
System.out.println("等待另一个文件传输软件来连接");
//等待另一个文件传输软件来连接
Socket client=server.accept();
DataInputStream in=new DataInputStream(client.getInputStream());
String choice=in.readUTF();
client.setSoTimeout(60000);//设置连接超时时间是一分钟
//有另一个文件传输软件点击了发送文件
System.out.println("与某个文件传输软件建立联系"+choice);
if(choice.equals("传送文件")){
//建立接收文件线程
System.out.println("传送文件");
new Accept_File(frame,client);
}
else if(choice.equals("发起聊天")){
if((JOptionPane.showConfirmDialog(frame,"对方向您发起聊天,您是否接受"))==0){
System.out.println("接受聊天邀请");
new Accept_Communication(client);
}else{
System.out.println("拒绝聊天邀请");
DataOutputStream out=new DataOutputStream(client.getOutputStream());
out.writeBoolean(false);
}
}
}//try
catch(IOException e2){System.out.println("连接超时!");}
}//while
}//run
public void setshowIP_frame(){
showIP_frame=new JFrame("显示本机的IP地址");
showIP_frame.setBounds(474,233,327,70);
showIP_frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
showIP_frame.setLayout(new FlowLayout());
JLabel label=new JLabel("您的IP地址是:");
showIP_frame.add(label);
try {
String s=InetAddress.getLocalHost().toString();
s=s.replaceAll(".+/", "");
JTextField JTF=new JTextField(s);
JTF.setEditable(false);
showIP_frame.add(JTF);
} catch (UnknownHostException e) {}
}
public void set_AboutMenu(){
About_frame=new JFrame("关于");
About_frame.setLayout(null);
About_frame.setBounds(465,251,358,173);
JLabel label=new JLabel("<html><br><img width=100 height=100 src=\"http://www.iconpng.com/png/windows-8-metro-invert/computer.png\"></br></html>");
label.setBounds(10,10,100,120);
JLabel author=new JLabel("By @author wuwave");
author.setBounds(153,47,200,20);
JLabel useTime=new JLabel("所用时间:");
useTime.setBounds(153,70,200,20);
useTime.setFont(new Font("新宋体",Font.BOLD,15));
JLabel time=new JLabel("2014.12.13-2014.12.18");
time.setFont(new Font("新宋体",Font.BOLD,15));
time.setBounds(153,90,200,20);
About_frame.add(label);
About_frame.add(author);
About_frame.add(useTime);
About_frame.add(time);
About_frame.setResizable(false);
}
public void setIP_JFrame(){
//新建IP地址设置窗口
First=true;
setIP_frame=new JFrame("设置所要连接的对象");
setIP_frame.setBounds(474,233,320,67);
setIP_frame.setLayout(new FlowLayout());
setIP_frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
ButtonGroup JCPG=new ButtonGroup();
JRadioButton JCB1=new JRadioButton("本机");
JRadioButton JCB2=new JRadioButton("其它电脑");
JTF=new JTextField(12);
JTF.setText("请输入其它电脑的IP地址");
JTF.setEnabled(false);
JCPG.add(JCB1);
JCPG.add(JCB2);
JCPG.setSelected(JCB1.getModel(), true);
setIP_frame.add(JCB1);
setIP_frame.add(JCB2);
setIP_frame.add(JTF);
JCB1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
//点击的如果是本机令isLocalPC为true,然后文本框不可输入
isLocalPC=true;
JTF.setEnabled(false);
}
});
JCB2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
//点击的如果是其它电脑令isLocalPC为false,然后文本框可以输入
isLocalPC=false;
JTF.setEnabled(true);
}
});
JTF.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e) {
if(First){
JTF.setText(null);
First=false;
}
}//mouseClicked
@Override
public void mouseEntered(MouseEvent e) {
//System.out.println(2);
}
@Override
public void mouseExited(MouseEvent e) {
//System.out.println(3);
}
@Override
public void mousePressed(MouseEvent e) {
// System.out.println(4);
}
@Override
public void mouseReleased(MouseEvent e) {
// System.out.println(5);
}
});
JTF.addCaretListener(new CaretListener(){
public void caretUpdate(CaretEvent e) {
//将文本框填写的IP地址赋给变量IP
IP=((JTextField)e.getSource()).getText();
}//caretUpdate
});
}//setIP_JFrame
public void actionPerformed(ActionEvent e){
if(e.getSource()==showport){
//按下显示端口的菜单子项
//查看该文件传输软件所设置的端口
JOptionPane.showMessageDialog(frame, "您设置的端口号是"+port1);
}//if
else if(e.getSource()==DeliveryFile){
//按下发送文件
//根据设置的是本机还是其它电脑建立发送文件线程
System.out.println("与另一个文件传输软件连接");
if(port!=0){
//根据设置的是本机还是其它电脑的IP设置发送文件线程
if(isLocalPC){
System.out.println("向本机发送文件");
new Delivery_File(port,frame);
}//if
else{
System.out.println("向对方发送文件");
new Delivery_File(port,frame,IP);
}//else
}//if
else{
JOptionPane.showMessageDialog(frame, "请先输入端口号");
}//else
}//else if
else if(e.getSource()==setIP){
//显示设置IP的窗口
setIP_frame.setVisible(true);
}//else if
else if(e.getSource()==showIP){
//显示设置IP的窗口
showIP_frame.setVisible(true);
}//else if
else if(e.getSource()==About){
About_frame.setVisible(true);
}//else if
else if(e.getSource()==Communicate){
System.out.println("发起聊天");
if(port!=0){
//根据设置的是本机还是其它电脑的IP设置发送文件线程
if(isLocalPC){
System.out.println("向本机发起聊天");
new Communication(frame,port);
}//if
else{
System.out.println("向对方发起聊天");
new Communication(frame,port,IP);
}//else
}//if
else{
JOptionPane.showMessageDialog(frame, "请先输入端口号");
}//else
}//if(Communicate)
}//actionPerformed
}