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

📄 qqclient.java

📁 java写的qq代码实现qq的部分功能
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
    		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 + -