📄 myserver.java
字号:
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 + -