2009年12月18日 00:30
作者:不得閒
前不久才發佈了原來的飛信控件的源碼!那個代碼中無法接收到最新的飛信的聊天發送過來的消息,想着可能就是協議有變動,今天在外面逛了半圈回來之後,開始着手分析3.5.24的聊天過程,果不其然,有變動了,以前是直來直往的發送信息,現在的消息發送就有點麻煩了,居然額外用了專門的聊天服務器,發起新的聊天請求時會創建新的鏈接,然後鏈接到聊天服務器之後,開始你來我往的不斷的驗證與註冊,完畢之後纔會開始正式的聊天信息的發送,難怪以前的收不到了哪!現在,我將分析的完整過程給下,有愛好的人,可以自行根據本協議的信息做相應的變動,來完成我發佈的那個控件還不能完成的功能:
發起聊天的方法:
1 、
客戶端( 59.174.141.61:2708 ) ------------ >> 服務器( 221.176.31.33:8080 )
S fetion.com.cn SIP-C/2.0
F: 815389316
I: 19
Q: 1 S
N: StartChat
請求開始聊天會話的信息
客戶端( 59.174.141.61:2708 ) <<------------ 服務器( 221.176.31.33:8080 )
服務器返回:
SIP-C/2.0 200 OK
I: 19
Q: 1 S
A: CS
address="221.176.31.108:8080;221.176.31.108:443",credential="1279087023.1583835504"
可見,客戶端請求成功!服務器端提供了 221.176.31.108:8080;221.176.31.108:443 可用
Credential 爲以後新建的 Socket 連接提供一個用於連接到服務器上的驗證權值
於是客戶端( 59.174.141.61:2708 ) 開始創建一個新的連接
我這裏創建的這個心連接的端口爲 3401 ,也就是說新連接的地址爲 59.174.141.61:3401
於是進入第二個步驟
2 、新連接連接到服務器,並且發送註冊消息
客戶端( 59.174.141.61:3401 ) --------->> 服務器( 221.176.31.108:8080 )
(注意一下這裏的主機已經不是步驟 1 中的主機,客戶機也不是步驟 1 中的客戶機)
發送註冊信息:
R fetion.com.cn SIP-C/2.0
F: 815389316
I: 1
Q: 0 R
A: TICKS auth="1279087023.1583835504"
K: text/html-fragment
K: multiparty
K: nudge
K: share-background
K: fetion-show
這裏注意裏面的 A: TICKS auth="1279087023.1583835504" ,這個 auth 就是在第一步中獲得的那個權值,提供用來登陸服務器驗證
客戶端( 59.174.141.61:3401 ) <<---------- 服務器( 221.176.31.108:8080 )
SIP-C/2.0 200 OK
I: 1
Q: 0 R
XI: 0bb0982aafb546a8af92e8d66fbe962c
X: 1200
K: text/plain
K: text/html-fragment
K: multiparty
K: nudge
K: share-background
K: fetion-show
返回成功了,也就是上面的註冊到聊天服務器成功 , 這裏的 K 值,用來表示服務器能夠接受的值類型方式(普通文本, html 等)
進入步驟三:
發送 InviteBuddy 命令邀請好友開始會話
3, 發送邀請
客戶端( 59.174.141.61:3401 ) ---------- >> 服務器( 221.176.31.108:8080 )
S fetion.com.cn SIP-C/2.0
F: 815389316
I: 2
Q: 0 S
N: InviteBuddy
L: 85
<args><contacts><contact uri="sip:[email protected];p=196" /></contacts></args>
發起聊天會話請求,來自於 815389716 ,向 sip:[email protected];p=196 發送一個請求
客戶端( 59.174.141.61:3401 ) <<---------- 服務器( 221.176.31.108:8080 )
// 發送請求成功
SIP-C/2.0 200 OK
I: 2
Q: 0 S
另一個客戶端的驗證請求
同時,服務器向 sip:[email protected];p=196 這個被 815389316 邀請要對話的用戶,發送一個有用戶向他對話的信息
客戶端( 59.174.141.61:3363 ) <<---------- 服務器( 221.176.31.108:8080 )
注意這個客戶端是 815389316 要求對話的人的地址
I 818332893 SIP-C/2.0
F: sip: [email protected];p=72
A: CS address="221.176.31.108:8080;221.176.31.108:443",credential="1279087023.1008491823"
I: -12
K: text/plain
K: text/html-fragment
K: multiparty
K: nudge
K: share-background
K: fetion-show
XI: 0bb0982aafb546a8af92e8d66fbe962c
L: 106
Q: 200002 I
AL : buddy
s=session
m=message
a=user:sip:[email protected];p=72
a=user:sip: [email protected];p=196
A 域中指定了聊天服務器的地址,以及登陸到聊天服務器的驗證權值
K 域指定了可接收的消息類型等
客戶端( 59.174.141.61:3363 ) -------- >> 服務器( 221.176.31.108:8080 )
SIP-C/2.0 200 OK
F: sip:[email protected];p=72
I: 4
Q: 3 I
客戶端反饋,同意與 sip:[email protected];p=72 對話
而後,客戶端( 59.174.141.61:3363 ) 這個客戶端開始創建一個新的 Socket 連接,然後用這個 Socket 連接到聊天服務器服務器( 221.176.31.108:8080 )
如新的 Socket 連接地址爲: 59.174.141.61:3403
之後,通以前那個一樣
這個新連接註冊到聊天服務器,發送註冊請求信息
客戶端( 59.174.141.61:3403 ) -------- >> 服務器( 221.176.31.108:8080 )
注意這裏的客戶端的地址已經是新 Socket 地址
R fetion.com.cn SIP-C/2.0
F: 818632893
I: 4
Q: 4 R
A: TICKS auth="1279087023.1008491823"
K: text/html-fragment
K: multiparty
K: nudge
K: share-background
K: fetion-show
服務器反饋
客戶端( 59.174.141.61:3403 ) <<-------- 服務器( 221.176.31.108:8080 )
SIP-C/2.0 200 OK
I: 4
Q: 4 R
XI: 0bb0982aafb546a8af92e8d66fbe962c
X: 1200
K: text/plain
K: text/html-fragment
K: multiparty
K: nudge
K: share-background
K: fetion-show
表示準備成功
然後服務器通知發起人 sip:[email protected];p=72 ,他的請求方已經進入對話狀態的信息:
客戶端( 59.174.141.61:3401 ) <<-------- 服務器( 221.176.31.108:8080 )
BN 815389716 SIP-C/2.0
I: 1
Q: 2 BN
N: Conversation
L: 100
<events><event type="UserEntered"><member
uri="sip:[email protected];p=196"/></event></events>
同時也向被請求方發送一條類似的信息
BN 818632893 SIP-C/2.0
I: 4
Q: 2 BN
N: Conversation
L: 99
<events><event type="UserEntered"><member
uri="sip:[email protected];p=72"/></event></events>
此時,一個完整的會話準備過程完成,以下開始對話過程
// 發起人發送
客戶端( 59.174.141.61:3401 ) ------ >> 服務器( 221.176.31.108:8080 )
M fetion.com.cn SIP-C/2.0
F: 815389716
I: 3
Q: 0 M
C: text/html-fragment
K: SaveHistory
L: 60
<Font Face=' 宋體 ' Color='-16777216' Size='10.5'>767</Font>
// 客戶端轉發到接收方
客戶端( 59.174.141.61:3403 ) <<------ 服務器( 221.176.31.108:8080 )
M 818632893 SIP-C/2.0
I: 4
Q: 3 M
F: sip:[email protected];p=72
C: text/html-fragment
K: SaveHistory
L: 60
D: Thu, 17 Dec 2009 16:13:57 GMT
XI: 345bc93d43884da5bc0365a48c91d3e1
<Font Face=' 宋體 ' Color='-16777216' Size='10.5'>767</Font>
接收方接收到消息之後,反饋一個成功信息給服務器
客戶端( 59.174.141.61:3403 ) ------ >> 服務器( 221.176.31.108:8080 )
SIP-C/2.0 200 OK
F: sip:[email protected];p=72
I: 4
Q: 3 M
然後服務器將本次的通信成功與否的信息轉給發話人
客戶端( 59.174.141.61:3403 ) <<------ 服務器( 221.176.31.108:8080 )
SIP-C/2.0 200 OK
I: 3
Q: 0 M
D: Thu, 17 Dec 2009 16:13:57 GMT
XI: 345bc93d43884da5bc0365a48c91d3e1
此致一個完整的聊天會話過程完成
全部分析完畢,睡覺!