smack - PacketWriter
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 스 레 드 를 열 어 서버 에 심 박 수 를 보 내 터미널 과 서버 의 긴 연결 을 유지 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.