📄 qqclient.java
字号:
packet.setReceiver(receiver);
packet.setMessage(message);
gate.send(MAIN_PORT, packet, true);
}
}
/**
* 修改用户的个人信息
* @param oldPassword 老密码,如果不修改密码,设成null
* @param newPassword 新密码,如果不修改密码,设成null
* @param contactInfo 其他信息
*/
public void modifyInfo(String oldPassword, String newPassword, ContactInfo contactInfo) {
if(user.isLoggedIn()) {
ModifyInfoPacket packet = new ModifyInfoPacket(user);
packet.setOldPassword(oldPassword);
packet.setNewPassword(newPassword);
for(int i = 1; i < QQ.QQ_CONTACT_FIELDS; i++) {
if(contactInfo.infos[i].equals("-"))
contactInfo.infos[i] = "";
}
packet.setContactInfo(contactInfo);
gate.send(MAIN_PORT, packet, true);
}
}
/**
* 得到一个用户的详细信息
* @param qqNum 想要得到的用户QQ号
*/
public void getUserInfo(int qqNum) {
if(user.isLoggedIn()) {
GetUserInfoPacket packet = new GetUserInfoPacket(user);
packet.setQQ(qqNum);
gate.send(MAIN_PORT, packet, false);
}
}
/**
* 请求取得好友名单,如果成功,将会触发get friend list success和
* get friend list end事件,用户需要监听这两个事件来得到所有的
* 好友信息
*/
public void getFriendList() {
if(gate.hasPort(MAIN_PORT)) {
// 请求取得好友名单
GetFriendListPacket packet = new GetFriendListPacket(user);
gate.send(MAIN_PORT, packet, false);
}
}
/**
* 请求取得好友名单,position指定了名单开始的偏移,建议初级用户不要使用此API
* @param position
*/
public void getFriendList(char position) {
if(gate.hasPort(MAIN_PORT)) {
// 请求取得好友名单
GetFriendListPacket packet = new GetFriendListPacket(user);
packet.setStartPosition(position);
gate.send(MAIN_PORT, packet, false);
}
}
/**
* 请求取得当前在线好友列表
*/
public void getFriendOnline() {
if(gate.hasPort(MAIN_PORT)) {
GetFriendOnlinePacket packet = new GetFriendOnlinePacket(user);
gate.send(MAIN_PORT, packet, false);
}
}
/**
* 请求取得当前在线好友列表
*/
public void getFriendOnline(byte startPosition) {
if(gate.hasPort(MAIN_PORT)) {
GetFriendOnlinePacket packet = new GetFriendOnlinePacket(user);
packet.setStartPosition(startPosition);
gate.send(MAIN_PORT, packet, false);
}
}
/**
* 使我的状态改变成在线
*/
public void makeMeOnline() {
if(user.isLoggedIn() && gate.hasPort(MAIN_PORT)) {
user.setStatus(QQ.QQ_FRIEND_STATUS_ONLINE);
ChangeStatusPacket packet = new ChangeStatusPacket(user);
packet.setShowFakeCam(user.isShowFakeCam());
gate.send(MAIN_PORT, packet, false);
}
}
/**
* 使我的状态改变成离开
*/
public void makeMeAway() {
if(user.isLoggedIn() && gate.hasPort(MAIN_PORT)) {
user.setStatus(QQ.QQ_FRIEND_STATUS_AWAY);
ChangeStatusPacket packet = new ChangeStatusPacket(user);
packet.setShowFakeCam(user.isShowFakeCam());
gate.send(MAIN_PORT, packet, false);
}
}
/**
* 使我的状态改变为隐身
*/
public void makeMeHidden() {
if(user.isLoggedIn() && gate.hasPort(MAIN_PORT)) {
user.setStatus(QQ.QQ_FRIEND_STATUS_HIDDEN);
ChangeStatusPacket packet = new ChangeStatusPacket(user);
packet.setShowFakeCam(user.isShowFakeCam());
gate.send(MAIN_PORT, packet, false);
}
}
/**
* 请求密钥
* @param request
*/
public void requestKey(byte request) {
if(user.isLoggedIn() && gate.hasPort(MAIN_PORT)) {
RequestKeyPacket packet = new RequestKeyPacket(user);
packet.setRequest(request);
gate.send(MAIN_PORT, packet, true);
}
}
/**
* 对绑定手机用户发送普通短消息
*
* @param receiver
* 接受者QQ号
* @param senderName
* 发送者昵称
* @param message
* 消息字节数组
* @param messageSequence
* 消息分片号
* @param sendMode
* 发送模式
* @return
* 发出包的序号
*/
public char sendSMS(int receiver, String senderName, byte[] message, char messageSequence, byte sendMode) {
if(user.isLoggedIn()) {
SendSMSPacket packet = new SendSMSPacket(user);
packet.setReceiver(receiver);
packet.setSenderName(senderName);
packet.setMessage(message);
packet.setMessageSequence(messageSequence);
packet.setSendMode(sendMode);
gate.send(MAIN_PORT, packet, false);
return packet.getSequence();
} else
return 0;
}
/**
* 对非绑定手机用户发送短消息
*
* @param mobileNumber
* @param senderName
* @param message
* @param messageSequence
* @param sendMode
* @return
* 发出的包序号
*/
public char sendSMS(String mobileNumber, String senderName, byte[] message, char messageSequence, byte sendMode) {
if(user.isLoggedIn()) {
SendSMSPacket packet = new SendSMSPacket(user);
packet.setDestinationType(QQ.QQ_SMS_DESTINATION_NOT_BIND_USER);
packet.setMobileNumber(mobileNumber);
packet.setSenderName(senderName);
packet.setMessage(message);
packet.setMessageSequence(messageSequence);
packet.setSendMode(sendMode);
gate.send(MAIN_PORT, packet, false);
return packet.getSequence();
} else
return 0;
}
/**
* 发送QQ提供的短消息
*
* @param receiver
* 接收者QQ号
* @param senderName
* 发送者昵称
* @param contentType
* 消息内容类型
* @param contentId
* 内容序号
* @param sendMode
* 发送模式
* @return
* 发出包的序号
*/
public char sendSMS(int receiver, String senderName, byte contentType, int contentId, byte sendMode) {
if(user.isLoggedIn()) {
SendSMSPacket packet = new SendSMSPacket(user);
packet.setReceiver(receiver);
packet.setSenderName(senderName);
packet.setContentType(contentType);
packet.setContentId(contentId);
packet.setSendMode(sendMode);
gate.send(MAIN_PORT, packet, false);
return packet.getSequence();
} else
return 0;
}
/**
* 对非绑定手机用户发送短消息
*
* @param mobileNumber
* @param senderName
* @param contentType
* @param contentId
* @param sendMode
* @return
* 发出包的序号
*/
public char sendSMS(String mobileNumber, String senderName, byte contentType, int contentId, byte sendMode) {
if(user.isLoggedIn()) {
SendSMSPacket packet = new SendSMSPacket(user);
packet.setDestinationType(QQ.QQ_SMS_DESTINATION_NOT_BIND_USER);
packet.setMobileNumber(mobileNumber);
packet.setSenderName(senderName);
packet.setContentType(contentType);
packet.setContentId(contentId);
packet.setSendMode(sendMode);
gate.send(MAIN_PORT, packet, false);
return packet.getSequence();
} else
return 0;
}
/**
* 通用方法,发送一个packet,注意packet必须已经执行过finalizeMessage
* 这个方法用在一些包构造比较复杂的情况下,比如上传分组信息这种包,
* 包中数据的来源是无法知道的也不是用几个参数就能概括的,可能也和实现有关。
* @param packet OutPacket子类
*/
public void sendPacket(OutPacket packet) {
if(user.isLoggedIn())
gate.send(MAIN_PORT, packet, true);
}
/**
* 通过指定port发送一个包
*
* @param packet
* @param port
*/
public void sendPacket(OutPacket packet, String port) {
sendPacket(packet, port, true);
}
/**
* 通过指定port发送一个包
*
* @param packet
* 输出包对象
* @param port
* port名称
* @param monitor
* true表示加入到包监视缓冲
*/
public void sendPacket(OutPacket packet, String port, boolean monitor) {
if(user.isLoggedIn())
gate.send(port, packet, monitor);
}
/**
* 不管有没有登录,都把包发出去
*
* @param packet
* @param port
*/
public void sendPacketAnyway(OutPacket packet, String port) {
gate.send(port, packet, true);
}
/**
* 执行一些退出会话的清楚工作
*
* @param thread
* @param gate
* @param porter
*/
private void clean(KeepAliveThread thread, PortGate gate, Porter porter) {
CleanRunnable cleanRunnable = new CleanRunnable(thread, gate, porter);
new Thread(cleanRunnable).start();
}
/**
* @return 登陆服务器IP
*/
public String getLoginServer() {
return loginServer;
}
/**
* @return Returns the user.
*/
public QQUser getUser() {
return user;
}
/**
* 添加一个QQ事件监听器
*
* @param listener
* QQListener
*/
public void addQQListener(IQQListener listener) {
if(!qqListeners.contains(listener)) {
qqListeners.add(listener);
setListenerChanged(true);
}
}
/**
* 移去一个QQ事件监听器
* @param listener QQListener
*/
public void removeQQListener(IQQListener listener) {
if(qqListeners.contains(listener)) {
qqListeners.remove(listener);
setListenerChanged(true);
}
}
/**
* 设置listener changed标志
*
* @param b
*/
private synchronized void setListenerChanged(boolean b) {
listenerChanged = b;
}
/**
* 得到listener changed标志
*
* @return
* true表示有新的listener添加了进来
*/
private synchronized boolean isListenerChanged() {
return listenerChanged;
}
/**
* 检查监听器是否已经改变,如果是则更新监听器
*/
private synchronized void checkListenerChange() {
if(isListenerChanged()) {
qqListenersBackup.clear();
qqListenersBackup.addAll(qqListeners);
setListenerChanged(false);
}
}
/**
* 触发QQ事件
* @param e QQEvent
*/
public void fireQQEvent(QQEvent e) {
checkListenerChange();
Iterator iter = qqListenersBackup.iterator();
while(iter.hasNext())
((IQQListener)iter.next()).qqEvent(e);
}
/**
* 登陆,使用缺省端口
*
* @throws Exception
* 如果登录出错
*/
public void login() throws Exception {
if (user != null && !logging && loginServer != null) {
// 登陆
if(user.isUdp())
login(loginServer, QQ.QQ_UDP_PORT);
else
login(loginServer, tcpLoginPort);
}
}
/**
* 用指定的服务器和端口登录
*
* @param loginServer 登陆服务器
* @param loginPort 登陆端口
* @throws Exception
* 如果登录出错
*/
protected void login(String loginServer, int loginPort) throws Exception {
// 检查是否设置了用户名和密码
if (user != null) {
// 停止以前的线程,如果有的话
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -