刚学java不久,对于类的理解不够深入,同学发我个文件传输的程序要偶讲讲其中类的功能介绍,以及类中主要方法,请各位大侠帮帮忙~(服务器端)Receive.javaimport javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;public class Receive implements ActionListener {
JFileChooser jc;
JFrame f;
ServerSocket ss;
Socket socket;
JButton b1,b2;
TextArea txt;
DataInputStream din;
DataOutputStream dout;public Receive() {
//界面布局
jc = new JFileChooser();
f = new JFrame("文件接收");
f.setLocation(100,300);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
b1 = new JButton("另存为",new ImageIcon("1.gif"));
b2 = new JButton("取消",new ImageIcon("2.gif"));
txt=new TextArea(10,40);
JScrollPane scrollpane = new JScrollPane(txt);
JPanel p = new JPanel();
p.add(b1);
p.add(b2);
Container c = f.getContentPane();
c.setLayout(new BorderLayout());
c.add(txt,BorderLayout.CENTER);
c.add(p,BorderLayout.NORTH);
f.setSize(400,150);
f.setVisible(true);
//注册事件
b1.addActionListener(this);
b2.addActionListener(this);
try { ss = new ServerSocket(4321);
while(!ss.isClosed()){
socket = ss.accept();
din = new DataInputStream(socket.getInputStream());
txt.append("开始接受文件:"+din.readUTF()+"\n");
}
} catch (IOException e) {
if(ss.isClosed()){
txt.append("End");
}else{
e.printStackTrace();
}
}
}public void actionPerformed(ActionEvent e)
{
//如果同意接收同,则启动线程接收文件
if(e.getSource()==b1)
{ jc.showSaveDialog(f);
FileReceive r= new FileReceive(jc.getSelectedFile(),socket);
r.start();
}else if(e.getSource()==b2){
System.out.println("用户取消接收!"+"\n");
System.exit(0);
}
}
class FileReceive extends Thread
{ File rfile;
Socket socket;
FileReceive(File rfile, Socket socket) {
this.rfile = rfile;
this.socket = socket;
}
public void run() {
//判断用户是否保存文件
if(rfile == null){ txt.append("没有保存!"+"\n"); return;
}
else{
//保存文件后,则向发送方发送同意(true)
try {
dout = new DataOutputStream(socket.getOutputStream());
dout.writeBoolean(true);
} catch (IOException e) {
e.printStackTrace();
}
}txt.append("开始接收..."+"\n");try {
FileOutputStream fout = new FileOutputStream(rfile);
BufferedOutputStream bout = new BufferedOutputStream(fout);
DataInputStream bin = new DataInputStream(socket.getInputStream());
byte[] buf = new byte[2048];
int num = bin.read(buf);
while(num != -1){
bout.write(buf,0,num);
bout.flush();
num = bin.read(buf);
}
bout.close();
bin.close();
txt.append("接收完成:"+ rfile.toString()+"\n");
} catch (Exception e) {
e.printStackTrace();
}
finally{
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}public static void main(String[] args)
{
new Receive();
}
}(客户端)Send.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.Socket;public class Send implements ActionListener{
JFileChooser jc;
JFrame f;
Socket socket;
DataInputStream din;
DataOutputStream dout;
JButton b1;
JButton b2;
TextArea txt;public Send() {
//界面布局
jc = new JFileChooser();
f = new JFrame("文件发送");
f.setLocation(100,100);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
b1 = new JButton("发送",new ImageIcon("go.gif"));
b2 = new JButton("取消",new ImageIcon("2.gif"));
txt=new TextArea(10,40);
JScrollPane scrollpane = new JScrollPane(txt);
JPanel jp = new JPanel();
jp.add(b1); jp.add(b2);
Container c = f.getContentPane();
c.add(jp,BorderLayout.NORTH);
c.add(scrollpane, BorderLayout.CENTER);
f.setSize(400,150);
f.setVisible(true);
b1.addActionListener(this);
b2.addActionListener(this);
}public void actionPerformed(ActionEvent e)
{ if(e.getSource() == b1)
{
jc.showOpenDialog(f);//弹出文件选择对话框
SendFile send = new SendFile(jc.getSelectedFile());
send.start();//启动新的线程传递文件
}else if(e.getSource()==b2){
System.out.println("用户取消发送!"+"\n");
System.exit(0);
}
}class SendFile extends Thread{
File file;//用户选择的文件public SendFile(File file)
{
this.file = file;
//初始化socket及其相关的输入输出流
try {
socket = new Socket("localhost",4321);
din = new DataInputStream(socket.getInputStream());
dout = new DataOutputStream(socket.getOutputStream());
} catch (IOException e) {e.printStackTrace();}
}public void run() {
try {
dout.writeUTF(file.getName()); //把文件名发送到接收方
txt.append("开始发送文件:"+file.getName()+"\n");
boolean isAccepted = din.readBoolean(); //判断接收方是否同意接收
if(isAccepted){ //如果同意接收则开始发送文件
txt.append("开始发送..."+"\n");
BufferedInputStream fin =
new BufferedInputStream(new FileInputStream(file));
byte[] buf = new byte[2048];
int num = fin.read(buf);
while(num != -1){
dout.write(buf,0,num);
dout.flush();
num = fin.read(buf);
}
fin.close();
txt.append("发送完成:" + file.toString()+"\n");
}
} catch (IOException e) {e.printStackTrace();}
finally{
try {
din.close();
dout.close();
socket.close();
} catch (IOException e) { e.printStackTrace(); }
}
}
}public static void main(String[] args)
{new Send();}}
package lib;import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;public class Receive implements ActionListener {
JFileChooser jc;
JFrame f;
ServerSocket ss;
Socket socket;
JButton b1, b2;
TextArea txt;
DataInputStream din;
DataOutputStream dout; public Receive() {
// 界面布局
jc = new JFileChooser(); // 文件选择器初始化
f = new JFrame("文件接收 ");
f.setLocation(100, 300); // 设置窗口位置
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 点窗口叉叉,关闭窗口
b1 = new JButton("另存为 ", new ImageIcon("1.gif "));// 两个小按钮
b2 = new JButton("取消 ", new ImageIcon("2.gif "));
txt = new TextArea(10, 40);
JScrollPane scrollpane = new JScrollPane(txt); // 可以下拉的面板
JPanel p = new JPanel();
p.add(b1);
p.add(b2);
Container c = f.getContentPane(); // 获取当前容器
// 布局
c.setLayout(new BorderLayout()); // 边缘布局(中东南西北)
c.add (txt, BorderLayout.CENTER); // txt放中间
c.add(p, BorderLayout.NORTH);
f.setSize(400, 150); // 设置窗体大小
f.setVisible(true); // 窗体设为可见
// 注册事件
b1.addActionListener(this);
b2.addActionListener(this); try {
ss = new ServerSocket(4321); // 服务端套接字初始化
// 不关闭,此循环不结束
while (!ss.isClosed()) {
// 一直在4321端口监听着
socket = ss.accept();
// 套接字输入流(简单来说,就是你接收的信息都在这个流里面,它是源头)
din = new DataInputStream(socket.getInputStream());
// txt将流里面的信息显示出来
txt.append("开始接受文件: " + din.readUTF() + "\n ");
}
} catch (IOException e) {
// 如果服务端套接字已被关闭,在txt上加上"End"
if (ss.isClosed()) {
txt.append("End ");
} else {
e.printStackTrace();
}
}
} /**
* 监听到事件后的实现
*/
public void actionPerformed(ActionEvent e) {
// 如果同意接收同,则启动线程接收文件(原注释)
if (e.getSource() == b1) { // 如果是JButton b1上发生的事件,你将b1定义为“另存为”
jc.showSaveDialog(f); // 系统保存对话框
// 这个是下面定义的类,下面解释
FileReceive r = new FileReceive(jc.getSelectedFile(), socket);
r.start();
} else if (e.getSource() == b2) {
// 不多说了
System.out.println("用户取消接收! " + "\n ");
System.exit(0); // 用户不接收,就退出,这下子窗口也关闭了吧!设计得挺奇怪的
// 难道不接收,我就不能干其他事情?!
}
} /**
* 内部类,是线程的子类
* @author bbb 我的计算机名真龊(^_^) 呵呵,这里与你无关
*/
class FileReceive extends Thread {
File rfile;
Socket socket;
// 带两个参数的构造方法,传文件和套接字进来
// 上面调用时,将你选择的文件和接收的信息分别传进来,前者用于保存后者的信息
FileReceive(File rfile, Socket socket) {
this.rfile = rfile;
this.socket = socket;
} public void run() {
// 判断用户是否保存文件(原注释)
// 没选择文件,自然为null,为null就给你一点提示,小样,别忽悠我!
if (rfile == null) {
txt.append("没有保存! " + "\n ");
return;
} else {
// 保存文件后,则向发送方 发送同意(true)
try {
// 输出流
dout = new DataOutputStream(socket.getOutputStream());
dout.writeBoolean(true);
} catch (IOException e) {
e.printStackTrace();
}
}
txt.append("开始接收... " + "\n "); try {
// 文件输出流 ,用来写文件的
FileOutputStream fout = new FileOutputStream(rfile);
// 包装一下
BufferedOutputStream bout = new BufferedOutputStream (fout);
// 获取套接字流内容
DataInputStream bin = new DataInputStream (socket.getInputStream());
byte[] buf = new byte[2048];
int num = bin.read(buf); // 将内容读取到一个byte数组中
while (num != -1) {
bout.write(buf, 0, num); // 使劲写
bout.flush(); // 清缓存,没有这句话,可能会死锁
num = bin.read(buf);
}
// 用的比较凌乱,搞这么多东东干嘛fout根本就没用到
// 讲卫生,比如说,饭后,你会找朋友要张餐巾纸吧!
bout.close();
bin.close();
txt.append("接收完成: " + rfile.toString() + "\n ");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 猪程序
*/
public static void main(String[] args) {
new Receive();
}
}
package lib;import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.Socket;public class Send implements ActionListener {
JFileChooser jc;
JFrame f;
Socket socket;
DataInputStream din;
DataOutputStream dout;
JButton b1;
JButton b2;
TextArea txt; public Send() {
// 界面布局
// 这些都不用解释了吧
jc = new JFileChooser();
f = new JFrame("文件发送 ");
f.setLocation(100, 100);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
b1 = new JButton("发送 ", new ImageIcon("go.gif "));
b2 = new JButton("取消 ", new ImageIcon("2.gif "));
txt = new TextArea(10, 40);
JScrollPane scrollpane = new JScrollPane(txt);
JPanel jp = new JPanel();
jp.add(b1);
jp.add(b2);
Container c = f.getContentPane();
c.add(jp, BorderLayout.NORTH);
c.add(scrollpane,BorderLayout.CENTER);
f.setSize(400, 150);
f.setVisible(true);
b1.addActionListener(this);
b2.addActionListener(this);
} public void actionPerformed (ActionEvent e) {
if (e.getSource() == b1) {
jc.showOpenDialog(f);// 弹出文件选择对话框
SendFile send = new SendFile(jc.getSelectedFile());
send.start();// 启动新的线程传递文件
} else if (e.getSource() == b2) {
System.out.println("用户取消发送! " + "\n ");
System.exit(0);
}
} class SendFile extends Thread {
File file;// 用户选择的文件 public SendFile(File file) {
this.file = file;
// 初始化socket及其相关的输入输出流
try {
// "localhost"是你发送消息的目的地址,一般填写IP,而localhost表示本机
// 信息传递至本机4321端口
socket = new Socket ("localhost ", 4321);
din = new DataInputStream (socket.getInputStream());
dout = new DataOutputStream (socket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
} public void run() { try {
// 一个比喻:很大的一个游泳馆,里面若干个池和一个铺设好的全自动化控制的水流管道系统。
// 流其实很形象,IP表示游泳池,端口(port)表示接收的孔,这边你只要设定好水要
// 流到哪个游泳池,从哪个口里进去,然后你将水灌进去就行了(就形成了一个水流
// sockec.getOutputStream)。然后,“那个自动化的水管调配系统”,会将水送到目的地。
// 目的地要从水流面获取水,就从源头(即水流socket.getInputStream)里面拿水,
// byte[] buf = new byte[2048]; 它们总是一个水分子一个水分子地拿!
// 而过滤流BufferedReader的目的是,我一次性将所有的水分子都拿出来,暂时放到一个盆
// 子里面(这样你可以方便的进行编码或者其他格式化动作,你也可以逐行读取)。
// 这里解释一下死锁:
// 文件名可比喻成一小口水,如果你不调用dout.flush()方法,那么系统懒得帮你送水,因为
// 它太少了;而这时候,发送的这边就想,水我已经是送出去了,就等对方反应了;而接收方一直
// 接收不到水,就纳闷了,水怎么还不送来呢?等....
// dout.flush()的作用是强制刷新流,将水流推过去(你告诉系统,"兄弟,这水可不便宜,是*
// **性感AV女优的口水,N多人等着呢!赶紧送吧!")
// 灌入文件名
dout.writeUTF(file.getName()); // 把文件名发送到接收方
txt.append("开始发送文件: " + file.getName() + "\n ");
boolean isAccepted = din.readBoolean(); // 判断接收方是否同意接收
if (isAccepted) { // 如果同意接收则开始发送文件
txt.append("开始发送... " + "\n ");
BufferedInputStream fin = new BufferedInputStream(new // 下面都差不多
FileInputStream(file));
byte[] buf = new byte[2048];
int num = fin.read(buf);
while (num != -1) {
dout.write(buf, 0, num);
dout.flush();
num = fin.read(buf);
}
fin.close();
txt.append("发送完成: " + file.toString() + "\n ");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
din.close();
dout.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
new Send();
}
}