mina請求第三方服務無響應問題解決

2021-09-01 23:47:46 字數 2309 閱讀 7411

在專案中需要與第三方服務對接,通過tcp協議傳送和接收資料。因為覺得apache的開源框架mina比較方便,所以在專案中直接使用了。主要的業務邏輯是先建立連線,然後在連線上進行資料的互動,等整個業務流程結束,主動斷開連線。但是在實際對接第三方服務時,發現雖然可以成功和伺服器建立連線,但是mina傳送請求引數後,伺服器返回的資料mina一直接收不到,而且也和對方技術確認過,資料確實已經返回了。在嘗試修改編碼格式(utf8、gbk等)和使用不同的protocolcodecfilter之後,發現並不是這些原因導致。

/**

* creates a new instance with the specified . the

* encoder uses a unix and the decoder uses

* the auto .

** @param charset

* the charset to use in the encoding and decoding

*/public textlinecodecfactory(charset charset)

我們可以看到編碼器和解碼器中都有linedelimiter,意思是分隔符。這兩個作為分隔符的常量分別是:

/**

* the line delimiter constant of unix ("\n")

*/public static final linedelimiter unix = new linedelimiter("\n");

/**

* a special line delimiter which is used for auto-detection of

* eol in . if this delimiter is used,

* will consider both '\r' and

* '\n' as a delimiter.

*/public static final linedelimiter auto = new linedelimiter("");

所以這裡編碼器在每一行的最後加上「\n」字元,標記行的結尾。解碼器使用的標記我們可以看注釋,它可以對應「\r」和「\n」,這樣在解析的時候就可以區分一次資料互動的末尾,解決粘包的問題;

和我對接的第三方服務是用c++語言編寫的,他們在接收和傳送tcp資料時,也使用了這種方法,只不過他們定義的資料結尾是「****」,所以只要呼叫textlinecodecfactory的(charset charset, string encodingdelimiter, string decodingdelimiter)這個建構函式,將對方指定的「****」當作decodingdelimiter,就可以接收資料了,主要**如下:

//建立客戶端連線

niosocketconnector connector = new niosocketconnector();

connector.getsessionconfig().setreceivebuffersize(10240); // 設定接收緩衝區的大小

connector.getsessionconfig().setsendbuffersize(10240);// 設定輸出緩衝區的大小

//建立接收資料的過濾器

defaultiofilterchainbuilder chain = connector.getfilterchain();

//設定此過濾器為一行一行的讀取資料

// 建立接受資料的過濾器

//此處的解碼分隔符使用「****」是為了和伺服器通訊時知曉接收到的資料的終點,來讓解碼器解析

textlinecodecfactory textlinecodecfactory = new textlinecodecfactory(charset.forname("gbk"),linedelimiter.unix.getvalue(),"****");

textlinecodecfactory.setdecodermaxlinelength(10240);//設定行解碼器長度

textlinecodecfactory.setencodermaxlinelength(10240);

// 設定這個過濾器將一行一行的讀取資料

connector.getfilterchain().addlast("codec1", new protocolcodecfilter(textlinecodecfactory));

這樣,我們就可以使用mina接收第三方服務返回的資料了,另外需要注意對方的資料編碼格式,我這邊需要使用「gbk」才能成功接收資料,否則在解析中文字元時會報錯。

第三方Push服務 Urban Airship

關於推送通知,除了蘋果的apns之外,我們還有其它選擇。urban airship就是其中之一。當然它的推送服務不是免費的。但它做的確實很好,不僅僅包含了ios平台,還有android平台推送。這是它們的產品介紹 一 推送通知 二 rich push 三 push composer 這是urban ...

第三方登入

我的應用就可以通過token第三方應用獲取一些基本資訊了,我的應用在獲取到這些基本資訊之後,就可以在我的應用中建立乙個賬號了。下次使用地方登入獲取到的這些使用者資訊,就可以直接用來登入我的應用了。為什麼先返回code呢?這個返回的code只能夠使用一次。這個code是從qq的伺服器返回給 時,我們時...

第三方註冊

第三方註冊 一些as hss建立如下表中的 ifc過濾規則,當終端在 s cscf 上註冊成功後,s cscf 從hss ifc過濾規則 s cscf 檢測所有過濾規則,發現 中的規則要求 ue ims.test 這個終端發出初始註冊訊息後,需要 到 sip as.ims.test 應用伺服器,之後...