⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myserver.java

📁 这个QQ通信系统项目是我之前发过类似的一个大的整合
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package server;

import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.BindException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Random;

import javax.swing.JTextArea;

import rule.Embody;
import rule.Order;
import dao.DAOFactory;
import rule.Message;
import rule.MyBean;

public class MyServer {
	private ServerSocket server = null;

	private boolean b_m = false;

	private Map<Integer, AcceptObj> map = new HashMap<Integer, AcceptObj>();

	private Hashtable<Integer, MyBean> hashtable = new Hashtable<Integer, MyBean>();

	private JTextArea jTextArea = null;

	public MyServer() {

	}

	public MyServer(ServerUI serverUI) {
		jTextArea = serverUI.getJTextArea();
		append("服务器启动中.......");
	}

	/**
	 * 在startServer里定义一个server并不停的接收每一个socket
	 * 
	 * 并为每一个socket开启一个Thread
	 */
	public void startServer() {
		try {
			server = new ServerSocket(8080);
			b_m = true;
			while (b_m) {
				Socket socket = server.accept(); // 接收每一个socket
				append("A client conneceted\n" + "IP:"
						+ socket.getInetAddress() + "\n" + "端口号:"
						+ socket.getPort());// 为每一个socket开启一个Thread
				new Thread(new AcceptObj(socket)).start();
			}

		} catch (BindException e) {
			append("端口使用中....\n请关掉相关程序并重新运行服务器");
			b_m = false;
			System.exit(0);
		} catch (SocketException e) {
			append("Server has been closed!");
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (server != null) {
					server.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	public void stopServer() {
		b_m = false;
		try {
			if (server != null) {
				server.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 定义一个内部类作线程用来接收客户端发来的信息
	 * 
	 * @author st0816003
	 * 
	 */
	public class AcceptObj implements Runnable {

		private Socket socket = null;

		private int mqq = 0;

		private int mUPort = 0;

		private InetAddress mIp = null;

		private boolean b_t = false;

		private ObjectInputStream ois = null;

		private ObjectOutputStream oos = null;

		public AcceptObj(Socket socket) {
			this.socket = socket;
			try {
				ois = new ObjectInputStream(socket.getInputStream());
				oos = new ObjectOutputStream(socket.getOutputStream());
			} catch (IOException e) {

				e.printStackTrace();
			}
		}

		public void run() {
			b_t = true;
			try {
				while (b_t) {// 不停接收数据并交给parseEmbody(obj)去解析
					Object obj = ois.readObject();
					if (obj != null) {
						parseEmbody(obj);
					}
				}
			} catch (SocketException e) {
				b_t = false;
				append("A Client Closed!\n" + "IP:" + socket.getInetAddress()
						+ "\n" + "端口号:" + socket.getPort());

				map.remove(mqq);// 如果对方死机了要做出相应的处理
				String sql = "update Account set state = 'off'" + "where qq ="
						+ mqq;
				DAOFactory.getDAOInstance().update(sql);
			} catch (EOFException e) {
				System.out.println("A Client Closed!!!!");
				b_t = false;
				map.remove(mqq);
			} catch (IOException e) {
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} finally {
				if (b_t == true) {
					try {
						if (ois != null) {
							ois.close();
						}
						if (oos != null) {
							oos.close();
						}
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
		}

		/**
		 * 定义一个方法用来向服务端发送信息
		 * 
		 * @param embody
		 */
		public void send(Embody embody) { // 发送信息
			try {
				oos.writeObject(embody);
				oos.flush();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		/**
		 * 定义一个方法把客户端发来的信息解析成Embody
		 * 
		 * @param obj
		 */
		public void parseEmbody(Object obj) {
			Embody embody = (Embody) obj;
			String order = embody.getOrder();
			if (mqq == 0) {
				append("收到客户" + order + "的信息:");
			} else {
				append("收到客户" + mqq + order + "的信息:");
			}
			if (order.equals(Order.REGISTER)) {
				MyBean myBean = (MyBean) embody.getObjMessage();
				int qq = new Random().nextInt(1000) + 8000;
				myBean.setQq(qq);
				if (DAOFactory.getDAOInstance().insert(myBean) == 1) {
					embody.setOrder(Order.S_REGISTER);
					embody.setObjMessage(myBean);
					send(embody); // 把客户信息插入数据库并查出id
				}
			}
			if (order.equals(Order.LOGIN)) {
				MyBean myBean = (MyBean) embody.getObjMessage();
				mqq = myBean.getQq();
				mUPort = myBean.getUPort();
				mIp = myBean.getIp();
				boolean b_flag = DAOFactory.getDAOInstance().queryCheckLogin(
						mqq, myBean.getPassword());// 登录验证
				if (b_flag) {
					MyBean myBean7 = DAOFactory.getDAOInstance().queryInfo(mqq);
					if (myBean7.getState().equals(Order.STATE_OFF)) {
						String sql = "update Account set state = '"
								+ myBean.getState() + "'" + "where qq =" + mqq;
						DAOFactory.getDAOInstance().update(sql);
						MyBean myBean2 = DAOFactory.getDAOInstance().queryInfo(
								mqq);
						embody.setObjMessage(myBean2);
						embody.setOrder(Order.S_LOGIN);// 更新个人资料
						send(embody);

						List<MyBean> list = DAOFactory.getDAOInstance()
								.queryFriend(mqq);
						Embody embody2 = new Embody();
						embody2.setObjMessage(list);// 更新好友
						embody2.setOrder(Order.ME_UPDATE);
						send(embody2);

						List<Message> list2 = DAOFactory.getDAOInstance()
								.queryMsg(mqq);
						if (!list2.isEmpty()) {// 更新消息留言
							Embody embody6 = new Embody();
							embody6.setObjMessage(list2);
							embody6.setOrder(Order.H_LEAVEWORD);
							send(embody6);
							DAOFactory.getDAOInstance().delete(mqq);
						}

						Embody embody5 = new Embody();
						embody5.setObjMessage(myBean);
						embody5.setOrder(Order.F_ON_LINE);

						Embody embody3 = new Embody();
						embody3.setObjMessage(myBean);// 通知在我之前上线的好友我上线了
						embody3.setOrder(Order.UDP_AFTER_ME);
						Map<Integer, MyBean> hashMap = new HashMap<Integer, MyBean>();
						for (MyBean bean : list) {
							if (bean.getState().equals(Order.STATE_ON)) {
								if (!map.isEmpty()) {
									map.get(bean.getQq()).send(embody3);
									map.get(bean.getQq()).send(embody5);
								}
								if (!hashtable.isEmpty()) {
									hashMap.put(bean.getQq(), hashtable
											.get(bean.getQq()));
								}
							}
						}

						Embody embody4 = new Embody();
						embody4.setObjMessage(hashMap);
						embody4.setOrder(Order.UDP_BEFOR_ME);
						if (!hashMap.isEmpty()) {// 我之后上线的好友上线后要通知我
							send(embody4);
						}
						hashtable.put(mqq, myBean);// 存放每一个客户的UDP端口号
						map.put(mqq, this);// 存放每一个客户的线程
					} else {
						embody.setOrder(Order.RE_LOGIN);
						send(embody);
					}
				} else {
					embody.setOrder(Order.F_LOGIN);
					send(embody);
				}
			}

			if (order.equals(Order.MODIFY_INFO)) {// 更改个人信息
				MyBean myBean = (MyBean) embody.getObjMessage();
				String sql = "update Account set  nickName = '"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -