【实例简介】
【实例截图】
【核心代码】
import java.net.*;
import java.util.List;
import java.awt.*;
import javax.swing.*;
import java.util.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.InetAddress;
import java.awt.event.WindowEvent;
import java.awt.event.WindowAdapter;
import java.io.*;
public class p2p {
boolean packFrame = false;
/**
* Construct and show the application.
*/
public p2p() {
MainFrame frame = new MainFrame();
// Validate frames that have preset sizes
// Pack frames that have useful preferred size info, e.g. from their layout
if (packFrame) {
frame.pack();
} else {
frame.validate();
}
// Center the window
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = frame.getSize();
if (frameSize.height > screenSize.height) {
frameSize.height = screenSize.height;
}
if (frameSize.width > screenSize.width) {
frameSize.width = screenSize.width;
}
frame.setLocation((screenSize.width - frameSize.width) / 2,
(screenSize.height - frameSize.height) / 2);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
UIManager.setLookAndFeel(UIManager.
getSystemLookAndFeelClassName());
} catch (Exception exception) {
exception.printStackTrace();
}
new p2p();
}
});
}
}
class MainFrame extends JFrame {
JPanel contentPane;
JButton jbtnSend = new JButton();
JButton jliaotian = new JButton();
JLabel jlblIP = new JLabel();
JLabel jlblIP1 = new JLabel();
JLabel jlblIP2 = new JLabel();
JButton jbtnSetting = new JButton();
JTabbedPane jtpTransFile = new JTabbedPane();
JTextArea help = new JTextArea(5, 20);
TransFileManager tfm=new TransFileManager(jtpTransFile);
public MainFrame() {
try {
setDefaultCloseOperation(EXIT_ON_CLOSE);
jbInit();
} catch (Exception exception) {
exception.printStackTrace();
}
}
private void jbInit() throws Exception {
contentPane = (JPanel) getContentPane();
contentPane.setLayout(null);
this.getContentPane().setBackground(new Color(206, 227, 249));
setSize(new Dimension(400, 300));
this.setResizable(false);
setTitle("P2P文件传输");
this.addWindowListener(new MainFrame_this_windowAdapter(this));
help.append("*基于局域网操作提示:\n");
help.append("1.直接在“对方IP”中填写对方软件右上角的“局域网IP”。\n");
help.append("2.在“对方端口号”中填写对方端口。\n");
help.append(" (注:端口号可在“设置”中修改)\n");
help.append("*基于Internet操作提示\n");
help.append("1.在“对方IP”中填写对方在Internet中的IP。\n");
help.append(" (注:此IP可以通过电脑上网查询,如:登陆www.ip138.com)\n");
help.append("2.在“对方端口号”中填写对方端口。\n");
help.append(" (注:端口号可在“设置”中修改)\n");
jbtnSend.setBackground(new Color(236, 247, 255));
jbtnSend.setBounds(new Rectangle(14, 4, 85, 25));
jbtnSend.setFont(new java.awt.Font("宋体", Font.PLAIN, 13));
jbtnSend.setBorder(BorderFactory.createRaisedBevelBorder());
jbtnSend.setText("发送文件");
jbtnSend.addActionListener(new MainFrame_jbtnSend_actionAdapter(this));
jbtnSetting.setBackground(new Color(236, 247, 255));
jbtnSetting.setBounds(new Rectangle(106,18,73, 25));
jbtnSetting.setFont(new java.awt.Font("宋体", Font.PLAIN, 13));
jbtnSetting.setBorder(BorderFactory.createRaisedBevelBorder());
jbtnSetting.setText("设置");
jliaotian.setBackground(new Color(236, 247, 255));
jliaotian.setBounds(new Rectangle(14, 29, 85, 25));
jliaotian.setFont(new java.awt.Font("宋体", Font.PLAIN, 13));
jliaotian.setBorder(BorderFactory.createRaisedBevelBorder());
jliaotian.setText("与TA聊天");
jliaotian.addActionListener(new java.awt.event.ActionListener() {public void actionPerformed(ActionEvent e) {new ChatFrame();}});
jbtnSetting.addActionListener(new MainFrame_jbtnSetting_actionAdapter(this));
jtpTransFile.setBackground(new Color(206, 227, 249));
jtpTransFile.setBounds(new Rectangle( 0, 54, 402, 246));
jlblIP.setFont(new java.awt.Font("宋体", Font.PLAIN, 13));
jlblIP.setBounds(new Rectangle(197, 5, 180, 16));
jlblIP1.setFont(new java.awt.Font("宋体", Font.PLAIN, 13));
jlblIP1.setBounds(new Rectangle(197, 21, 250, 16));
jlblIP1.setText("在Internet上的IP请上网查询");
jlblIP2.setFont(new java.awt.Font("宋体", Font.PLAIN, 13));
jlblIP2.setBounds(new Rectangle(197, 36, 250, 16));
jlblIP2.setText("(如:www.ip138.com)");
contentPane.setBackground(new Color(206, 227, 249));
jtpTransFile.add(help,"帮助");
contentPane.setToolTipText("");
contentPane.add(jtpTransFile);
contentPane.add(jbtnSend);
contentPane.add(jbtnSetting);
contentPane.add(jliaotian);
contentPane.add(jlblIP);
contentPane.add(jlblIP1);
contentPane.add(jlblIP2);
byte [] ip=InetAddress.getLocalHost().getAddress();
jlblIP.setText("局域网IP:" (ip[0]&0xff) "." (ip[1]&0xff) "." (ip[2]&0xff) "." (ip[3]&0xff));
tfm.start();
}
public void jbtnSetting_actionPerformed(ActionEvent e) {
SettingDialog sd=new SettingDialog(this);
sd.jtfPort.setText(String.valueOf(tfm.port));
sd.jspnThreadNum.setValue(new Integer(tfm.maxThreadNum));
sd.show();
if(sd.flag){
if(tfm.port!=sd.port){
tfm.setPort(sd.port);
}
tfm.setMaxThreadNum(sd.threadNum);
}
}
public void jbtnSend_actionPerformed(ActionEvent e) {
TransFileDialog tfd=new TransFileDialog(this);
tfd.show();
if(tfd.flag){
for(int i=0;i
tfm.sendFile(tfd.serverName,tfd.port,tfd.files[i].getAbsolutePath(),tfd.message);
}
}
}
public void this_windowClosed(WindowEvent e) {
tfm.close();
}
}
class MainFrame_this_windowAdapter extends WindowAdapter {
private MainFrame adaptee;
MainFrame_this_windowAdapter(MainFrame adaptee) {
this.adaptee = adaptee;
}
public void windowClosed(WindowEvent e) {
adaptee.this_windowClosed(e);
}
}
class MainFrame_jbtnSend_actionAdapter implements ActionListener {
private MainFrame adaptee;
MainFrame_jbtnSend_actionAdapter(MainFrame adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jbtnSend_actionPerformed(e);
}
}
class MainFrame_jbtnSetting_actionAdapter implements ActionListener {
private MainFrame adaptee;
MainFrame_jbtnSetting_actionAdapter(MainFrame adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jbtnSetting_actionPerformed(e);
}
}
class Server extends Thread {
public Server() {
try {
jbInit();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public int port=5000;
public int maxThreadNum=5;
private ServerSocket checkServer = null;
private SocketThread socketThread = null;
private Socket aSocket = null;
private List socketPool; //socket连接池
private boolean serverRunning = false; //服务器是否运行
//构造函数
public Server(List socketPool) {
this.socketPool = socketPool;
}
public void run() {
serverRunning = true;
try {
checkServer = new ServerSocket(port);
checkServer.setSoTimeout(60000);
} catch (IOException ex) {
ex.printStackTrace();
}
while (serverRunning) {
try {
System.out.println("Started...");
aSocket = checkServer.accept();
System.out.println("client connected");
socketThread = new SocketThread(aSocket);
socketThread.start();
if(socketPool.size()>=maxThreadNum){
socketThread.stopThread();
}
else{
socketPool.add(socketThread);
}
}
catch (Exception ex) {
ex.printStackTrace();
}
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
try {
checkServer.close();
} catch (IOException ex1) {
}
}
public void stopThread(){
serverRunning=false;
}
private void jbInit() throws Exception {
}
}
class SettingDialog extends JDialog {
boolean flag=false;
int threadNum;
int port;
JLabel jlblThreadNum = new JLabel();
JSpinner jspnThreadNum = new JSpinner(new SpinnerNumberModel(5,1,10,1));
JLabel jlblPort = new JLabel();
JTextField