import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;
import java.text.DecimalFormat;
import java.util.Date;
class FileSender extends JFrame implements ActionListener{
ListenerThread lt; /*监听各种消息的线程*/
Container container;
JLabel jLabel,status,fileStatus,listenerStatus,fileSendRate,fileAcceptRate;
JTextField jTextField;
JButton connect,send,message,accept,refuse;
JTextArea jTextArea,jTextArea2;
JPanel jPanel,jPanelLeft,jPanel2,jPanelRight;
JProgressBar jProgressBar,jProgressBarAccept;
String IP; //用于记录你主动去连接的对方的IP信息
Socket talkingSocket;
PrintWriter output;
BufferedReader input;
public FileSender() {
super("P2P聊天系统");
super.setBackground(Color.blue);
container = this.getContentPane();
container.setLayout( new BorderLayout() );
jPanelLeft = new JPanel();/*开始左半部的布局*/
jPanelLeft.setLayout( new BorderLayout() );
jTextArea = new JTextArea();
jTextArea.setLineWrap( true );
jTextArea.setEditable( false );
send = new JButton("发送文件");
send.setBackground(Color.orange);
send.addActionListener( new SendHandler(this) );
jTextArea2 = new JTextArea( );
jTextArea.setLineWrap( true );
message = new JButton("发送");
message.setBackground(Color.blue);
message.addActionListener(this);
message.setEnabled( false );
jPanel2 = new JPanel();
jPanel2.setLayout( new GridLayout(1,2) );/*一行两列,用于放两按钮*/
jPanel2.add(send);
jPanel2.add(message);
jPanel = new JPanel();
jPanel.setLayout( new BorderLayout() );
jPanel.setPreferredSize( new Dimension(400,200) );
jPanel.add( new JScrollPane(jTextArea2), BorderLayout.CENTER);/*书写发送内容*/
jPanel.add(jPanel2,BorderLayout.SOUTH);
jPanelLeft.add( new JScrollPane(jTextArea), BorderLayout.CENTER);
jPanelLeft.add( jPanel, BorderLayout.SOUTH); /*结束左半部的布局*/
jLabel = new JLabel("对方IP");/*开始右半部的布局*/
jTextField = new JTextField();
jTextField.setPreferredSize( new Dimension( 150,25) );
connect = new JButton("连接");
connect.setBackground(Color.green);
connect.addActionListener( this );
status = new JLabel();
status.setPreferredSize( new Dimension(150,40) );
jProgressBar = new JProgressBar();/*处理进度*/
jProgressBar.setVisible( false );
fileSendRate = new JLabel();
fileStatus = new JLabel();
fileStatus.setPreferredSize( new Dimension(150,100) );
listenerStatus = new JLabel();
listenerStatus.setPreferredSize(new Dimension( 150,100) );
accept = new JButton("接收");
accept.setBackground(Color.green);
accept.setEnabled( false );
accept.addActionListener( this );
refuse = new JButton("拒绝");
refuse.setBackground(Color.orange);
refuse.addActionListener( this );
refuse.setEnabled( false );
jProgressBarAccept = new JProgressBar();
jProgressBarAccept.setVisible( false );
fileAcceptRate = new JLabel();
fileAcceptRate.setPreferredSize( new Dimension(150,50) );
jPanelRight = new JPanel();
jPanelRight.setLayout( new FlowLayout() );
jPanelRight.add( jLabel );
jPanelRight.add( jTextField );
jPanelRight.add( connect );
jPanelRight.add( status );
jPanelRight.add( fileStatus );
jPanelRight.add( jProgressBar );
jPanelRight.add( fileSendRate );
jPanelRight.setPreferredSize( new Dimension(150,50) );
jPanelRight.add( listenerStatus );
jPanelRight.add( accept );
jPanelRight.add( refuse );
jPanelRight.add( jProgressBarAccept );
jPanelRight.add( fileAcceptRate );
jPanelRight.setBackground(Color.pink);
jPanelRight.setPreferredSize( new Dimension(150,500) ); /*结束右半部的布局*/
container.add( jPanelLeft, BorderLayout.CENTER );
container.add( jPanelRight, BorderLayout.EAST );
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
}
});
lt = new ListenerThread(this);
lt.start();
}
public static void main(String args[]) {
System.out.println("Starting FileSender...");
FileSender mainFrame = new FileSender();
mainFrame.setSize(500,520);
mainFrame.setVisible(true);
}
public void actionPerformed( ActionEvent e)
{
if (e.getSource().equals(message))
{
String str = jTextArea2.getText();
if( str.equals("") )
{
JOptionPane.showMessageDialog(this,"发送的内容不能为空",
"空消息",JOptionPane.WARNING_MESSAGE);
}
else
{
jTextArea.append( "[I]"+str+"\n");
jTextArea2.setText("");
// sdk.start();
}
}
if( e.getSource().equals(connect))
{
new Thread()
{
public void run()
{
try
{
String Ip = jTextField.getText();
if( Ip.equals("") )
{
JOptionPane.showMessageDialog( jPanelRight,"请先输入对方IP",
"IP为空",JOptionPane.ERROR_MESSAGE);
}
else
{
status.setText( "<html>连接中.......");
talkingSocket = new Socket(jTextField.getText() ,9999);
output = new PrintWriter( talkingSocket.getOutputStream(), true );
output.println("[TALK]");
status.setText( "<html>连接成功,可以进行<p>交谈了");
input = new BufferedReader( new InputStreamReader( talkingSocket.getInputStream() ) );
IP = jTextField.getText();
message.setEnabled( true );
connect.setEnabled( true );
}
}
catch( IOException ioe)
{
System.err.println(ioe.toString());
status.setText("<html>连接失败,请检查主机名<p>是否正确");
}
}
}
.start();
connect.setEnabled( false );
}
if( e.getSource().equals(accept))//接受文件的请求
{
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileSelectionMode( JFileChooser.DIRECTORIES_ONLY );
int result = fileChooser.showSaveDialog( this );
if( result == JFileChooser.CANCEL_OPTION )
return;
File filePath = fileChooser.getSelectedFile();
if( filePath == null||filePath.getName().equals("") )
{
JOptionPane.showMessageDialog( this, "Invalid File Name",
"Invalid File Name", JOptionPane.ERROR_MESSAGE);
}
else
{
File file = new File( filePath, lt.fileName );
ReceiverThread receiver = new ReceiverThread( lt.fileReceiver, file, listenerStatus,this.fileAcceptRate,this.jProgressBarAccept,lt.lengthOfFile );
receiver.start();
accept.setEnabled( false );
refuse.setEnabled( false );
}
}
if( e.getSource() == refuse )
{
try
{
PrintWriter output= new PrintWriter( lt.fileReceiver.getOutputStream(), true );
output.println( "No" );
refuse.setEnabled(false);
accept.setEnabled(false);
/*获得了要求传输文件过来的socket的InetAddress*/
InetAddress address = this.lt.fileReceiver.getInetAddress();
this.listenerStatus.setText("<html>您拒绝了来自<p>["+address.toString()
+"]<p>的文件传输请求");
output.close();
lt.fileReceiver.close();
}
catch( Exception ee)
{
ee.printStackTrace( System.err );
}
}
}
}
class SendHandler implements ActionListener
{
FileSender myFather;
SendHandler( FileSender father )
{
myFather = father;
}
public void actionPerformed( ActionEvent e )
{
if( myFather.IP == null )
{
JOptionPane.showMessageDialog( myFather,"请先连接对方",
"尚未建立连接",JOptionPane.WARNING_MESSAGE);
}
else
{
/*清除上次文件传输的内容*/
myFather.fileSendRate.setText("");
JFileChooser fileChooser = new
评论0
最新资源