import java.net.*;
import java.io.*;
import java.util.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;

class Server extends JFrame {

	private java.awt.List list = new java.awt.List();// ߿ͻб
	private ServerSocket server;// 
	private Socket client;// ͻ
	private Map<String, Socket> container = new HashMap<String, Socket>();// HashMap
	Panel p3 = new Panel();
	ImageIcon ico1 = new ImageIcon("e:/hong.png");
	ImageIcon ico2 = new ImageIcon("e:/lv.png");
	JButton l1 = new JButton("tom", ico1);
	JButton l2 = new JButton("peter", ico1);
	JButton l3 = new JButton("mary", ico1);
	JButton l4 = new JButton("herry", ico1);
	JButton l5 = new JButton("li", ico1);
	JButton l6 = new JButton("", ico1);
	JButton l7 = new JButton("СС", ico1);
	JButton l8 = new JButton("ëë", ico1);
	JButton l9 = new JButton("", ico1);
	JButton l10 = new JButton("", ico1);
	JButton l11 = new JButton("ţţ", ico1);
	JButton l12 = new JButton("", ico1);
	void init() {
		// 
		Panel p1 = new Panel();
		Panel p2 = new Panel();
		// е
		JButton startButton = new JButton("");
		FlowLayout fl = new FlowLayout(FlowLayout.LEFT);
		p1.setLayout(fl);
		p1.add(startButton);
		p2.setLayout(new BorderLayout());
		p2.add(list, BorderLayout.CENTER);
		p3.setLayout(new GridLayout(3, 4));
		p3.add(l1);
		//ఴť
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.add(BorderLayout.CENTER, p3);
		this.add(BorderLayout.EAST, p2);
		this.add(BorderLayout.SOUTH, p1);
		this.setTitle("");
		this.setBounds(100, 100, 1000, 550);
		this.setVisible(true);
		// ""ť
		startButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Thread t = new Start();
				t.start();}
		});
	}
//ڲ
class Start extends Thread // ߳
	{
	public void run() {
		try {
		if (server != null && !server.isClosed()) {
			System.out.println("!!\n");
		} else {
			server = new ServerSocket(2009);// 
			System.out.println((new Date()).toString() + '\n' + "ϲ!"
							+ "ɹ!" + "\n\n");
		}
		while (true) {
			client = server.accept();
			Thread sgS = new SgService(client);// Ϊÿλ¼Ŀͻһ߳
			sgS.start();// ͻ߳
		}
		} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	// ͻ߳
	class SgService extends Thread {
		private Socket client = null;// ͻ׽
		private BufferedReader br = null;// 
		private PrintStream ps = null;
		private String name = null;

		SgService(Socket client) {// 췽
			this.client = client;
		}
		public void run() {
			try {
			br = new BufferedReader(new InputStreamReader(client
						.getInputStream()));
			ps = new PrintStream(client.getOutputStream());
			String msg = null;
			while ((msg = br.readLine()) != null) {
                                                   // ѭ,ζſԺͿͻ޴ν
			          name = msg;
				container.put(name, client);
				for (int i = 0; i < 12; i++) {
				                if (l1.getText().equals(name))l1.setIcon(ico2);
					if (l2.getText().equals(name))	l2.setIcon(ico2);
					if (l3.getText().equals(name))l3.setIcon(ico2);
					if (l4.getText().equals(name))l4.setIcon(ico2);
					if (l5.getText().equals(name))l5.setIcon(ico2);
					if (l6.getText().equals(name))l6.setIcon(ico2);
					if (l7.getText().equals(name))l7.setIcon(ico2);
					if (l8.getText().equals(name))l8.setIcon(ico2);
					if (l9.getText().equals(name))l9.setIcon(ico2);
					if (l10.getText().equals(name))l10.setIcon(ico2);
					if (l11.getText().equals(name))l11.setIcon(ico2);
					if (l12.getText().equals(name))l12.setIcon(ico2);

					}
					list.add(name + "¼ϵͳ");
				}
			} catch (Exception ex) {
			list.add(name + "ˣ");
			for (int i = 0; i < 12; i++) {
				if (l1.getText().equals(name))l1.setIcon(ico1);
				if (l2.getText().equals(name))l2.setIcon(ico1);
				if (l3.getText().equals(name))l3.setIcon(ico1);
				if (l4.getText().equals(name))l4.setIcon(ico1);
				if (l5.getText().equals(name))l5.setIcon(ico1);
				if (l6.getText().equals(name))l6.setIcon(ico1);
				if (l7.getText().equals(name))l7.setIcon(ico1);
				if (l8.getText().equals(name))l8.setIcon(ico1);
				if (l9.getText().equals(name))l9.setIcon(ico1);
				if (l10.getText().equals(name))l10.setIcon(ico1);
				if (l11.getText().equals(name))l11.setIcon(ico1);
				if (l12.getText().equals(name))l12.setIcon(ico1);
				}
				container.remove(name);
			}
		}
	}
	public static void main(String[] args) {
		new Server().init(); // 
		System.out.println(":");
	}
}


//¼
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

class Login extends JFrame implements ActionListener {
	JTextField txtName = new JTextField("", 15);;// ǳ
	JButton btnLogin = new JButton("½");;// ¼ť
	JButton btnCancel = new JButton("ȡ");;
	JPanel p1 = new JPanel();
	JPanel p2 = new JPanel();
	JPanel p3 = new JPanel();
	JPanel p4 = new JPanel();
	JLabel l = new JLabel("ӭ¼ң");
	JLabel l1 = new JLabel("ǳ:");
	Socket toServer;// 
	BufferedReader in;
	PrintStream out;
	public Login() {// 
		p1.add(l1);
		p1.add(txtName);
		p2.add(p1);
		btnLogin.addActionListener(this);
		btnCancel.addActionListener(this);
		this.setLayout(new BorderLayout());
		p3.add(btnLogin);
		p3.add(btnCancel);
		p4.add(l);
		this.add(BorderLayout.NORTH, p4);
		this.add(BorderLayout.SOUTH, p3);
		this.add(BorderLayout.CENTER, p2);
		this.setSize(350, 180);
		this.setTitle("û¼");
		this.setResizable(false);
		this.setLocation(450, 250);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	// ʵ"¼""ȡ"ťļ
	public void actionPerformed(ActionEvent e) {
		JButton button = (JButton) e.getSource();
		if (button.equals(btnCancel)) {
			dispose();// ͻ"ȡ"ť,ô¼ھ͹ر
		} else {// ͻ"¼",ôӷ
			LoginStart ls = new LoginStart();
			ls.start();
			this.dispose();// ͬʱرյ¼
		}
	}
	class LoginStart extends Thread {
		public void run() {
			String name = txtName.getText();// ȡÿͻǳ
			try {
				toServer = new Socket("127.0.0.1", 2009); // ӷ
				// socket(""˿ں);
				in = new BufferedReader(new InputStreamReader(toServer
						.getInputStream())); // 
				out = new PrintStream(toServer.getOutputStream());// 
				new Client(out, in, name);// ¼ɹ,򵯳ͻ
			} catch (Exception e2) {
				System.out.println("¼ʧ!");
                                                            // ¼ʧ,ӡ"¼ʧ",Ը֪ͻ
				e2.printStackTrace();
			}
		}
	}
	public static void main(String[] args) {
		new Login();// ¼
	}
}


import java.awt.BorderLayout;
import java.awt.List;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintStream;
import javax.swing.JFrame;
import javax.swing.JLabel;
class Client extends JFrame {
	PrintStream out; // 
	BufferedReader in; // 
	String name;
	List list = new List();
	JLabel lb1 = new JLabel("ӭ٣");
	void init() {// 
		this.pack();
		this.add(BorderLayout.NORTH, lb1);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setTitle("ͻ");
		this.setSize(100, 100);
		this.setVisible(true);
	}
	public Client(PrintStream out, BufferedReader in, String name) {// 췽
		this.out = out;
		this.in = in;
		this.name = name;
		lb1.setText("ӭ:" + name + "٣");
		init();// ͻ˴
		out.println(name);
		receive();// ʼͨ
	}
	public void receive() { // ܷ˷Ϣ
		try {
			String text = null;
			while ((text = in.readLine()) != null) {
				System.out.println(text);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				in.close();
				out.close();
			} catch (Exception ex) {
				ex.printStackTrace();
			}
		}
	}
}
