package chat.client;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.EOFException;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.net.SocketException;import java.util.ArrayList;import javax.swing.BorderFactory;import javax.swing.DefaultListModel;import javax.swing.JList;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.border.BevelBorder;public class ChatServer { static ServerSocket ss = null; static boolean started = false; static Socket s; static ArrayList<Client> clients; JPanel panel; static DefaultListModel model; JList list; public static void main(String[] args) throws IOException { new ChatServer(); ss = new ServerSocket(9999); System.out.println("Waiting for client to connect..."); started = true; clients = new ArrayList<Client>(); while (started) { s = ss.accept(); System.out.println("A client connected!"); Client c = new Client(s); clients.add(c); new Thread(c).start(); System.out.println("目前在线人数:"+clients.size()); } } public ChatServer() { super(); panel=new JPanel(); model=new DefaultListModel(); list=new JList(model); list.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); panel.add(new JScrollPane(list)); } static class Client implements Runnable { private boolean bConnect = false; private DataInputStream dis = null; private DataOutputStream dos = null; private Socket s; public Client(Socket s) { super(); this.s = s; try { dis = new DataInputStream(s.getInputStream()); dos = new DataOutputStream(s.getOutputStream()); } catch (IOException e) { e.printStackTrace(); } } @Override public void run() { boolean bConnected = true; while (bConnected) { try { String str = dis.readUTF(); for (int i = 0; i < clients.size(); i++) { Client c1 = clients.get(i); c1.send(str); } } catch (EOFException e) { System.out.println("一个client端已经退出"); clients.remove(this); System.out.println("目前在线人数:"+clients.size()); try { dis.close(); dos.close(); s.close(); } catch (IOException e1) { e1.printStackTrace(); } bConnected = false; } catch (SocketException e) { clients.remove(this); System.out.println("client端已经退出"); System.out.println("目前在线人数:"+clients.size()); try { dis.close(); dos.close(); s.close(); } catch (IOException e1) { e1.printStackTrace(); } bConnected = false; } catch (IOException e) { e.printStackTrace(); } } } public void send(String str) { try { dos.writeUTF(str); } catch (IOException e) { e.printStackTrace(); } } }}

解决方案 »

  1.   

    package chat.client;import java.awt.BorderLayout;import java.awt.Color;import java.awt.GridLayout;import java.awt.HeadlessException;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.EOFException;import java.io.IOException;import java.net.Socket;import java.net.SocketException;import java.net.UnknownHostException;import java.util.ArrayList;import java.util.Map;import javax.swing.BorderFactory;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JTextArea;import javax.swing.JTextField;import javax.swing.table.AbstractTableModel;public class ChatView extends JFrame { private JPanel panel; private JLabel label; private JTextArea ta_show; private JTextField tf; private DataOutputStream dos = null; private DataInputStream dis = null; private ArrayList<String> clients; private Socket s; private boolean bConnected; private Thread recv; private String userName; public ChatView() throws HeadlessException, UnknownHostException, IOException { super("Hava a good Chat"); userName = LoginView.name; panel = new JPanel(); this.add(panel, BorderLayout.WEST); label = new JLabel("OnlineUser"); panel.add(label); panel.setBorder(BorderFactory.createLineBorder(Color.red)); ta_show = new JTextArea(); ta_show.setEditable(false); this.add(ta_show, BorderLayout.CENTER); tf = new JTextField(); tf.addActionListener(new TFListener()); connect(); this.add(tf, BorderLayout.SOUTH); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { try { dis.close(); dos.close(); s.close(); bConnected = false; try { recv.join(); } catch (InterruptedException e1) { e1.printStackTrace(); } System.exit(0); } catch (IOException e1) { e1.printStackTrace(); } } }); this.pack(); } private class TFListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { String str = userName + ":" + tf.getText().trim(); tf.setText(""); try { dos.writeUTF(str); } catch (IOException e1) { e1.printStackTrace(); } } } public void connect() throws UnknownHostException, IOException { s = new Socket("127.0.0.1", 9999); dos = new DataOutputStream(s.getOutputStream()); dis = new DataInputStream(s.getInputStream()); bConnected = true; System.out.println("connected to server."); } public void launchFrame() { setBounds(300, 300, 400, 400); setVisible(true); recv = new Thread(new Receive()); recv.start(); } private class Receive implements Runnable { @Override public void run() { try { while (bConnected) { String str = dis.readUTF(); ta_show.setText(ta_show.getText() + str + "\n"); } } catch (SocketException e) { try { dis.close(); } catch (IOException e1) { e1.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } } }}
      

  2.   

    package chat.client;import java.awt.BorderLayout;import java.awt.GridLayout;import java.awt.HeadlessException;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.net.Socket;import java.net.UnknownHostException;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JList;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JPasswordField;import javax.swing.JTextArea;import javax.swing.JTextField;public class LoginView extends JFrame implements ActionListener { private JPanel panel1, panel2; private JTextField tf1; private JPasswordField pf1; private JLabel p1_label1, p1_label2; private JButton bt1, bt2; private JList friendList; static String name; public LoginView() throws HeadlessException { super("葱头QQ2088"); panel1 = new JPanel(new GridLayout(2, 2)); tf1 = new JTextField(15); pf1 = new JPasswordField(15); p1_label1 = new JLabel("帐号"); p1_label2 = new JLabel("密码"); panel1.add(p1_label1); panel1.add(tf1); panel1.add(p1_label2); panel1.add(pf1); this.add(panel1, BorderLayout.CENTER); panel2 = new JPanel(); bt1 = new JButton("登录"); bt1.addActionListener(this); bt2 = new JButton("取消"); bt2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.exit(0); } }); panel2.add(bt1); panel2.add(bt2); this.add(panel2, BorderLayout.SOUTH); this.setVisible(true); this.setBounds(500, 500, 300, 300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } @Override public void actionPerformed(ActionEvent e) { if (bt1 == e.getSource()) { name = tf1.getText().trim(); if (name.equals("")) { JOptionPane.showMessageDialog(this, "请输入用户名!"); return; } } try { new ChatView().launchFrame(); } catch (HeadlessException e1) { e1.printStackTrace(); } catch (UnknownHostException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } this.dispose(); } public static void main(String[] args) { new LoginView(); }}