package com.jz.icq.server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.List;
import com.jz.icq.common.Constants;
import com.jz.icq.model.bean.IcqUser;
import com.jz.icq.model.dao.FriendDAO;
import com.jz.icq.model.dao.FriendDAOImpl;
import com.jz.icq.model.dao.IcqUserDAO;
import com.jz.icq.model.dao.IcqUserDAOImpl;
import com.jz.icq.protocol.IcqRequest;
import com.jz.icq.protocol.UdpSocket;
public class ServerThread extends Thread{
private UdpSocket udpSocket = null;
private Socket s = null;
private ObjectInputStream inputStream = null;
private ObjectOutputStream outputStream = null;
//处理用户上线(谁加我为好友了,并且在线,就通知他我上线了)
private void onLine(IcqUser icqUser) {
//查询在线的,并且加我为好友的人
String sql = "select * from icqUser where icqNo " +
"in(select icqNo from friend where friendNo='" + icqUser.getIcqNo() + "')" +
" and status='1'";
FriendDAO friendDAO = new FriendDAOImpl();
List onlineFriends = friendDAO.queryFriendsBySQL(sql);
byte[] pool = new byte[1024];
try {
for(int i = 0; i < onlineFriends.size(); i++){
IcqUser tempIcqUser = (IcqUser)onlineFriends.get(i);
DatagramPacket sendDatagramPacket =
new DatagramPacket(pool,
pool.length,
InetAddress.getByName(tempIcqUser.getIp()),
Integer.parseInt(tempIcqUser.getPort()));
String data = Constants.ONLINE + Constants.UDP_PACKET_SYMBOL + icqUser.getIcqNo()
+ Constants.UDP_PACKET_SYMBOL + icqUser.getIp()
+ Constants.UDP_PACKET_SYMBOL + icqUser.getPort();
sendDatagramPacket.setData(data.getBytes());
this.udpSocket.getSocket().send(sendDatagramPacket);
}
} catch (NumberFormatException e) {
System.out.println("offLine:NumberFormatException");
e.printStackTrace();
} catch (UnknownHostException e) {
System.out.println("offLine:UnknownHostException");
e.printStackTrace();
} catch (IOException e) {
System.out.println("offLine:IOException");
e.printStackTrace();
}
}
//处理用户下线
private void offLine(IcqUser user) {
String sql = "update icqUser set status='0',ip='0',port='0' where icqNo='" + user.getIcqNo() + "'";
IcqUserDAO icqUserDAO = new IcqUserDAOImpl();
icqUserDAO.update(sql);
//查询在线好友
String sql2 = "select * from icqUser where icqNo " +
"in(select friendNo from friend where icqNo='" + user.getIcqNo() + "')" +
" and status='1'";
FriendDAO friendDAO = new FriendDAOImpl();
List onlineFriends = friendDAO.queryFriendsBySQL(sql2);
byte[] pool = new byte[1024];
try {
for(int i = 0; i < onlineFriends.size(); i++){
IcqUser tempIcqUser = (IcqUser)onlineFriends.get(i);
DatagramPacket sendDatagramPacket =
new DatagramPacket(pool,
pool.length,
InetAddress.getByName(tempIcqUser.getIp()),
Integer.parseInt(tempIcqUser.getPort()));
String data = Constants.OFFLINE + Constants.UDP_PACKET_SYMBOL + user.getIcqNo();
sendDatagramPacket.setData(data.getBytes());
this.udpSocket.getSocket().send(sendDatagramPacket);
}
} catch (NumberFormatException e) {
System.out.println("offLine:NumberFormatException");
e.printStackTrace();
} catch (UnknownHostException e) {
System.out.println("offLine:UnknownHostException");
e.printStackTrace();
} catch (IOException e) {
System.out.println("offLine:IOException");
e.printStackTrace();
}
}
//登陆验证
private boolean isRightUser(IcqUser icqUser) {
boolean flag = false;
IcqUserDAO userDAO = new IcqUserDAOImpl();
IcqUser rUser = userDAO.queryById(icqUser.getIcqNo());
if(rUser != null) {
if((rUser.getPassword()).equals(icqUser.getPassword())) {
flag = true;
}
}
return flag;
}
//用户注册
private boolean registered(IcqUser icqUser) {
icqUser.setStatus("0");
icqUser.setIp("0");
icqUser.setPort("0");
boolean flag = false;
IcqUserDAO userDAO = new IcqUserDAOImpl();
int n = userDAO.add(icqUser);
if(n > 0) {
flag = true;
}
return flag;
}
//修改用户状态
private void modifyUserState(IcqUser user) {
String clientNo = user.getIcqNo();
String clientIp = this.s.getInetAddress().getHostAddress();
String clientPort = user.getPort();
System.out.println(clientPort);
String clientState = "1";
String sql = "update icqUser set " +
"status='" + clientState + "', " +
"ip='" + clientIp + "', " +
"port='" + clientPort + "' where icqno = '" + clientNo + "'";
System.out.println(sql);
IcqUserDAO icqUserDAO = new IcqUserDAOImpl();
icqUserDAO.update(sql);
}
//查找登陆用户完整信息
private IcqUser getIcqUser(String UserNo) {
IcqUserDAO icqUserDAO = new IcqUserDAOImpl();
return icqUserDAO.queryById(UserNo);
}
public ServerThread() {}
public ServerThread(Socket s) {
try {
this.s = s;
this.outputStream = new ObjectOutputStream(this.s.getOutputStream());
this.inputStream = new ObjectInputStream(this.s.getInputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//查找登陆好友列表
private List getFriendList(String icqUserNo) {
FriendDAO friendDAO = new FriendDAOImpl();
List list = friendDAO.queryFriends(icqUserNo);
return list;
}
public void run() {
IcqUser fullUser = null;
IcqRequest receiveRequest = null;
try {
while(true) {
receiveRequest = (IcqRequest)this.inputStream.readObject();
String flag = receiveRequest.getFlag();
if(flag.equals(Constants.LOGIN)) {
System.out.println("登陆!");
IcqUser logUser = (IcqUser)receiveRequest.getAttribute(Constants.ICQ_USER);
IcqRequest sendRequest = new IcqRequest();
//验证
if(this.isRightUser(logUser)) {
sendRequest.setFlag(Constants.SUCCESSFUL);
} else {
sendRequest.setFlag(Constants.FAILURE);
}
//修改状态
this.modifyUserState(logUser);
//查找完整信息
fullUser = this.getIcqUser(logUser.getIcqNo());
this.udpSocket = new UdpSocket();
//通知上线
this.onLine(fullUser);
sendRequest.setAttribute(Constants.ICQ_USER, fullUser);
this.outputStream.writeObject(sendRequest);
this.outputStream.flush();
} else if(flag.equals(Constants.REGISTER)) {
System.out.println("注册!");
IcqUser regUser = (IcqUser)receiveRequest.getAttribute(Constants.ICQ_USER);
IcqRequest sendRequest = new IcqRequest();
if(this.registered(regUser)) {
sendRequest.setFlag(Constants.SUCCESSFUL);
} else {
sendRequest.setFlag(Constants.FAILURE);
}
this.outputStream.writeObject(sendRequest);
this.outputStream.flush();
} else if(flag.equals(Constants.FIND_FRIEND)) {
List list = this.getFriendList(((IcqUser)receiveRequest.getAttribute(Constants.ICQ_USER)).getIcqNo());
IcqRequest sendRequest = new IcqRequest();
sendRequest.setAttribute(Constants.FIND, list);
this.outputStream.writeObject(sendRequest);
this.outputStream.flush();
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
this.offLine(fullUser);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
QQ-JAVA.rar_java qq_qq.java_qq1666.com_qq9scom_即时通讯 Java

共59个文件
java:25个
class:25个
properties:2个

1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
16 浏览量
2022-09-21
08:58:04
上传
评论
收藏 297KB RAR 举报
温馨提示
实时聊天工具,类似腾讯qq,主要功能有实时聊天,修改备注,发图片,发视频音频等等,有助于学习和了解java网络通信编程。
资源推荐
资源详情
资源评论










收起资源包目录















































































































共 59 条
- 1
资源评论


四散
- 粉丝: 28
- 资源: 1万+
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


会员权益专享
安全验证
文档复制为VIP权益,开通VIP直接复制
