import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
/**
 * 
 * @author tian	QQ服务器端
 *
 */
public class Server {
	JFrame jf = new JFrame("QQ服务器");
	JPanel jp = new JPanel();
	JPanel jp1 = new JPanel();
	JTextArea jta = new JTextArea();
	JTextArea jta1 = new JTextArea();
	JScrollPane jsp = new JScrollPane(jta1);
	JLabel jl = new JLabel("QQ在线列表");

	protected ServerSocket ss;
	DefaultListModel dlm = new DefaultListModel();
	JList jli = new JList(dlm);
	ArrayList uml = new ArrayList();
	HashMap mp = new HashMap();		//存储socket对应的oos
	HashMap mp1 = new HashMap();	//存储用户所对应的socket
	
//	 初始化服务器
	public Server() {
		jf.add(jp, BorderLayout.NORTH);
		jp.setLayout(new FlowLayout(FlowLayout.LEFT));
		jp.add(jl);
		jf.add(jli, BorderLayout.CENTER);
		jf.add(jsp, BorderLayout.SOUTH);
		jta1.setSize(250, 300);
		jsp.setSize(250, 300);
		jf.setSize(250, 500);
		jf.setLocation(500, 150);
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jf.setVisible(true);

		try {
			ss = new ServerSocket(9999);
			Thread t = new ServerThread();
			t.start();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 
	 * 监听线程
	 *
	 */
	class ServerThread extends Thread {
		public void run() {

			try {
				while (true) {
					Socket sc = ss.accept();
					ObjectOutputStream oos = new ObjectOutputStream(sc
							.getOutputStream());
					mp.put(sc, oos);
					SocketThread st = new SocketThread(sc);
					st.start();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}
	
	/**
	 * 
	 * 读线程
	 *
	 */
	class SocketThread extends Thread {
		Socket sc;

		public SocketThread(Socket sc) {
			this.sc = sc;
		}

		public void run() {
			try {
				ObjectInputStream ois = new ObjectInputStream(sc
						.getInputStream());
				while (true) {
					Object m = ois.readObject();
					// 处理用户信息
					if (m instanceof Usermessage) {
						Usermessage u = (Usermessage) m;
						// 如果flag1为true,则是登陆信息
						if (u.flag1 && Server.checkuser(u,uml,mp)) {
							mp1.put(u.username, sc);
							dlm.addElement(sc.getRemoteSocketAddress() + "\n");
							uml.add(u);
							Object[] o = uml.toArray();
							Iterator i = mp.keySet().iterator();
							while (i.hasNext()) {
								Socket sc = (Socket) i.next();
								((ObjectOutputStream) mp.get(sc))
										.writeObject(o);
							}
						} else if(!u.flag1){
							ois.close();
							ObjectOutputStream oos = (ObjectOutputStream) mp
									.get(sc);
							oos.close();
							sc.close();
							mp.remove(sc);
							for (int i = 0; i < uml.size(); i++) { // 通过for循环可以遍历ArrayList
								Usermessage um = (Usermessage) uml.get(i); // 通过下标输出ArrayList里面的值
								if (um.username.equals(u.username)) {
									uml.remove(i);
									break;
								}
							}
							Object[] o = new Object[1];
							o[0] = u;
							Iterator i = mp.keySet().iterator();
							while (i.hasNext()) {
								Socket sc = (Socket) i.next();
								((ObjectOutputStream) mp.get(sc))
										.writeObject(o);
							}
						}
					}
					// 处理聊天信息
					if (m instanceof Message) {
						Message u = (Message) m;
						//处理群聊
						if (u.toname.equals("alluser")) {
							ArrayList al = new ArrayList();
							al.add(u);
							Object[] o1 = al.toArray();
							Iterator i = mp.keySet().iterator();
							while (i.hasNext()) {
								Socket sc = (Socket) i.next();
								((ObjectOutputStream) mp.get(sc))
										.writeObject(o1);
							}
						}else{
							//处理私聊和文件传送
							ArrayList al = new ArrayList();
							al.add(u);
							Object[] o1 = al.toArray();
							((ObjectOutputStream) mp.get(mp1.get(u.toname))).writeObject(o1);
						}
					}
				}
			} catch (IOException e1) {
//				e1.printStackTrace();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
		}
	}

	//检测用户名是否重复
	public static boolean checkuser(Usermessage u,ArrayList uml,HashMap mp){
		
		ArrayList uml1 = uml;
		int i;
		for (i = 0; i < uml1.size(); i++) { // 通过for循环可以遍历ArrayList
			Usermessage um = (Usermessage) uml1.get(i); // 通过下标输出ArrayList里面的值
			if (um.username.equals(u.username)) {
				String s = "用户名重复请重新填写";
				Object[] o = new Object[1];
				o[0] = s;
				Iterator it = mp.keySet().iterator();
				while (it.hasNext()) {
					try {
						Socket sc = (Socket) it.next();
						((ObjectOutputStream) mp.get(sc))
								.writeObject(o);
					} catch (IOException e) {
						e.printStackTrace();
					}

				}
			break;	
			}
		}
		if(i>=uml1.size()){
		String s = "success";
		Object[] o = new Object[1];
		o[0] = s;
		Iterator it = mp.keySet().iterator();
		while (it.hasNext()) {
			
			try {
				Socket sc = (Socket) it.next();
				((ObjectOutputStream) mp.get(sc))
						.writeObject(o);
			} catch (IOException e) {
				e.printStackTrace();
			}

		}
		return true;
		}else{
			
			
			return false;
		}
		
		
	}
	
	public static void main(String[] args) {
		Server s = new Server();
	}
}
最近下载更多
cksndh  LV4 2023年8月16日
fuyouou  LV5 2023年6月29日
yuanchuang  LV22 2023年2月14日
liys1234  LV9 2022年6月21日
微信网友_6003487859068928  LV5 2022年6月15日
微信网友_5989987974549504  LV5 2022年6月5日
17岁的孩子想糖吃  LV7 2021年12月31日
111111255  LV2 2021年12月24日
Aoifee  LV4 2021年11月10日
最近浏览更多
goccgoccgocc  LV4 5月9日
krispeng  LV13 4月15日
陈小灏  LV15 2023年12月26日
luamweise 2023年10月18日
暂无贡献等级
wertttak  LV1 2023年9月26日
小新Coding  LV9 2023年9月7日
cksndh  LV4 2023年8月16日
fuyouou  LV5 2023年6月29日
2017143155  LV12 2023年6月24日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友