问题写在注释中了,请大家帮忙解决一下谢谢import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;@SuppressWarnings("serial")
public class Talk extends JFrame
{
private ServerSocket server;
private Socket[] sockets;
private ServerSocket fileServer;
private Socket[] fileSockets;
private static final int MAX_LINK = 10;
private String ip;
private File file;

public Talk() throws IOException 
{
server = new ServerSocket(1680);
sockets = new Socket[MAX_LINK];
fileServer = new ServerSocket(1681);
sockets = new Socket[MAX_LINK];
new ListenThread().start();
new FileListenThread().start();

JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("Menu");
menuBar.add(menu);
JMenuItem chatItem = new JMenuItem("Chat");
JMenuItem fileSendItem = new JMenuItem("Send File");
JMenuItem exitItem = new JMenuItem("Exit");
menu.add(chatItem);
menu.add(fileSendItem);
menu.addSeparator();
menu.add(exitItem);

setJMenuBar(menuBar);

chatItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
ip = JOptionPane.showInputDialog(Talk.this, "Please input a IP address: ");
if (ip == null || ip.equals(""))
return;

EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
Socket socket = new Socket();
socket.connect(new InetSocketAddress(ip, 1680), 10000);
JFrame frame = new TalkFrame(socket);
frame.setVisible(true);
}
catch (SocketTimeoutException e)
{
JOptionPane.showMessageDialog(Talk.this, "connect timeout");
}
catch (IOException e)
{
e.printStackTrace();
}

}
});
}
});

fileSendItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
/*
 * 为什么注释下面的那句话程序没有执行呢?
 * 按理说当程序点击Send File之后会弹出一个选择文件的对话框才对啊
 * 怎么就没有了呢?我表示无法理解,请高手帮忙。
 */
file = new JFileChooser().getSelectedFile();
ip = JOptionPane.showInputDialog(Talk.this, "Send to: ");
new SendFileThread(file, ip).start();
}
});

exitItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
System.exit(0);
}
});
}

public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
JFrame frame = new Talk();
frame.setTitle("Talker");
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
catch (IOException e)
{
e.printStackTrace();
}
}
});
}

private class FileListenThread extends Thread
{
public void run()
{
while (true)
{
for (int i = 0; i < MAX_LINK; i++)
{
try
{
fileSockets[i] = fileServer.accept();
String message = "Receive file from " + fileSockets[i].getInetAddress().getHostAddress();
int t = JOptionPane.showConfirmDialog(Talk.this, message, message, JOptionPane.YES_NO_OPTION);
if (t == JOptionPane.OK_OPTION)
{
new ReceiveFileThread(fileSockets[i]).start();
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
}

private class ListenThread extends Thread
{
public void run()
{
while (true)
{
for (int i = 0; i < MAX_LINK; i++)
{
try
{
sockets[i] = server.accept();
String message = "Talk with " + sockets[i].getInetAddress().getHostAddress() + "?";
int t = JOptionPane.showConfirmDialog(Talk.this, message, message, JOptionPane.YES_NO_OPTION);
if (t == JOptionPane.OK_OPTION)
{
JFrame frame = new TalkFrame(sockets[i]);
frame.setVisible(true);
}

catch (IOException e)
{
e.printStackTrace();
}
}
}
}
}

private class TalkFrame extends JFrame
{
private JTextArea record = new JTextArea(10, 30);
private JTextField message = new JTextField(20);
private JButton btnSend = new JButton("Send");
private PipedWriter pipeOut;
private PipedReader pipeIn;

public TalkFrame(Socket socket) throws IOException
{
pipeOut = new PipedWriter();
pipeIn = new PipedReader(pipeOut);
String ip = socket.getInetAddress().getHostAddress();
setTitle("Talk with " + ip);
setLayout(new BorderLayout());

add(new JLabel("Talk Record: "), BorderLayout.NORTH);
add(new JScrollPane(record), BorderLayout.CENTER);
record.setEditable(false);

JPanel panel = new JPanel();
panel.add(new JLabel("Message: "));
panel.add(message);
panel.add(btnSend);
add(panel, BorderLayout.SOUTH);
btnSend.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
PrintWriter out = new PrintWriter(pipeOut);
out.println(message.getText());
record.append("I: " + message.getText() + "\n");
message.setText("");
}
});

addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent event)
{
setVisible(false);
record.setText("");
}
});
new WriteThread(pipeIn, new PrintWriter(socket.getOutputStream())).start();
new ReadThread(this, ip, record, new BufferedReader(new InputStreamReader(socket.getInputStream()))).start();
setSize(400, 300);
setLocationByPlatform(true);
setVisible(true);
}
} private class WriteThread extends Thread
{
private PrintWriter out;
private BufferedReader in;

public WriteThread(PipedReader pipeIn, PrintWriter out)
{
this.out = out;
this.in = new BufferedReader(pipeIn);
}

public void run()
{
while (true)
{
try
{
while (true)
{
String s = in.readLine();
out.println(s);
out.flush();
}
}
catch (IOException e)
{
e.printStackTrace();
break;
}
}
}
}

private class ReadThread extends Thread
{
private BufferedReader in;
private JTextArea record;
private String ip;
private JFrame frame;

public ReadThread(JFrame frame, String ip, JTextArea record, BufferedReader in)
{
this.frame = frame;
this.ip = ip;
this.in = in;
this.record = record;
}

public void run()
{
while (true)
{
try
{
record.append(ip + ": " + in.readLine() + "\n");
frame.setVisible(true);
}
catch (IOException e)
{
e.printStackTrace();
break;
}
}
}
}

private class ReceiveFileThread extends Thread
{
private File file;
private String ip;
private BufferedReader in;
private PrintWriter out;
private Socket socket;

public ReceiveFileThread(Socket socket)
{
this.socket = socket;
}

public void run()
{
try
{
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
file = new File(in.readLine());
out = new PrintWriter(new FileWriter(file));
String s;
while ((s = in.readLine()) != null)
{
out.println(s);
}
in.close();
out.close();
socket.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}

private class SendFileThread extends Thread
{
private File file;
private String ip;
private BufferedReader in;
private Socket socket;
private PrintWriter out;

public SendFileThread(File file, String ip)
{
this.file = file;
this.ip = ip;
}

public void run()
{
try
{
in = new BufferedReader(new FileReader(file));
socket = new Socket(ip, 1681);
out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
out.println(file.getName());
in.((int)file.length());
String c;
while ((c = in.readLine()) != null)
out.println(c);
in.close();
out.close();
socket.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}