smack - PacketWriter

5458 단어 자바smack
다음으로 이동:
http://blog.csdn.net/wqhjfree/article/details/7194416
PacketWriter 는 initConnection () 방법 을 소개 하 는 전편 에서 만 들 었 습 니 다. PacketWriter 의 실현 을 자세히 살 펴 보 겠 습 니 다.
protected PacketWriter(XMPPConnection connection) {
        this.queue = new ArrayBlockingQueue<Packet>(500, true);
        this.connection = connection;
        init();
 }




protected void init() {
        this.writer = connection.writer;
        done = false;
        lastActive = System.currentTimeMillis();
        
        //            
        writerThread = new Thread() {
            public void run() {
                writePackets(this);
            }
        };

        writerThread.setName("Smack Packet Writer (" + connection.connectionCounterValue + ")");
        writerThread.setDaemon(true);

    }



/**
     *         
     * @param thisThread
     */
    private void writePackets(Thread thisThread) {
        try {
            // Open the stream.
            openStream();
            // Write out packets from the queue.
            while (!done && (writerThread == thisThread)) {
                Packet packet = nextPacket();
                if (packet != null) {
                    synchronized (writer) {
                        writer.write(packet.toXML());
                        writer.flush();
                        // Keep track of the last time a stanza was sent to the
                        // server
                        lastActive = System.currentTimeMillis();
                    }
                }
            }

            synchronized (writer) {
                while (!queue.isEmpty()) {
                    Packet packet = queue.remove();
                    writer.write(packet.toXML());
                }
                writer.flush();
            }

            queue.clear();
            writer.write("</stream:stream>");
            writer.flush();

        } catch (IOException ioe) {
            if (!done) {
                done = true;
                connection.packetReader.notifyConnectionError(ioe);
            }
        } finally {
            try {
                if (writer != null) {
                    writer.close();
                }
            } catch (Exception e) {
            }
        }
    }

PacketWriter 구조 방법 에서 매개 변수 XMPConnection 을 PacketWriter 구성원 변수 로 전달 한 다음 init () 방법 을 호출 합 니 다. init () 방법 에 서 는 서버 에 데 이 터 를 쓰 는 데 사용 되 는 스 레 드 를 엽 니 다. writer Packets () 안 은 무한 순환 체 입 니 다. 메시지 대기 열 quue 에서 packet 메 시 지 를 읽 고 wirter. flush () 방법 을 계속 호출 합 니 다.메 시 지 를 보 낸 서버 입 니 다. 이 과정 은 터미널 서버 에서 메 시 지 를 보 내 는 과정 을 마 쳤 습 니 다.
다음은 터미널 이 클 라 우 드 와 어떻게 연결 되 는 지, 그것 은 틀림없이 심장 박동 가방 을 보 내 는 것 입 니 다. Packet Writer 가 심장 박동 가방 을 어떻게 보 내 는 지 살 펴 보 겠 습 니 다.
/**
     * A TimerTask that keeps connections to the server alive by sending a space
     * character on an interval.
     */
    private class KeepAliveTask implements Runnable {

        private int delay;
        private Thread thread;

        public KeepAliveTask(int delay) {
            this.delay = delay;
        }

        protected void setThread(Thread thread) {
            this.thread = thread;
        }
        
        public void run() {
            try {
                // Sleep 15 seconds before sending first heartbeat. This will give time to
                // properly finish TLS negotiation and then start sending heartbeats.
                Thread.sleep(15000);
            }
            catch (InterruptedException ie) {
                // Do nothing
            }
            while (!done && keepAliveThread == thread) {
                synchronized (writer) {
                    // Send heartbeat if no packet has been sent to the server for a given time
                    if (System.currentTimeMillis() - lastActive >= delay) {
                        try {
                            writer.write(" ");
                            writer.flush();
                        }
                        catch (Exception e) {
                            // Do nothing
                        }
                    }
                }
                try {
                    // Sleep until we should write the next keep-alive.
                    Thread.sleep(delay);
                }
                catch (InterruptedException ie) {
                    // Do nothing
                }
            }
        }
    }

심장 박동 전송 클래스: KeepAlive Task 는 사용자 정의 스 레 드 입 니 다. 심장 박동 이 보 내 는 시간 간격 을 정의 합 니 다. run 방법 에서 무한 순환 체 는 delay 밀리초 마다 클 라 우 드 에 빈 메 시 지 를 보 냅 니 다.로그 인 에 성공 하면 KeepAlive Task 스 레 드 를 열 어 서버 에 심 박 수 를 보 내 터미널 과 서버 의 긴 연결 을 유지 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기