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
2024年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日

最近浏览