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(); } }
最近下载更多
微信网友_7004855557083136 LV1
5月22日
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日
最近浏览更多
微信网友_7004855557083136 LV1
5月22日
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日