模擬實現 網路擁堵的狀況 mina

2021-09-30 04:42:28 字數 2546 閱讀 4990

在mina的protocoldecoder合併 未完整傳送的資料報。

由於socket方面的基礎不紮實,對nio的理解不深入,

這幾天看了apache mina 2.0.0-m1 裡的相關**,才明白了nio的處理和我先前理解的不一樣

雖然在

考慮到了客戶端把多個pdu資料報一次傳送的情況,卻沒有考慮到pdu資料報被分片傳送的情況,

於是以前寫的protocoldecoder在網路環境惡劣或客戶端沒有整包傳送資料的情況下,就會出現問題,

在protocoldecoder增加了合併pdu資料報的處理,經過測試,pdu資料報分片傳送的時候,服務端也能夠正常解析了。

客戶端往socket傳送資料報的**:

[code]

byte bo = bao.tobytearray();

sc.getoutputstream().write(bo, 0, 4);//先發四個位元組

thread.sleep(500);

sc.getoutputstream().write(bo, 4, 8);//再傳送8個位元組

thread.sleep(500);

sc.getoutputstream().write(bo, 12, bo.length - 12);//再把剩餘的資料發過去

[/code]

服務端改進後的**:

[code]

package com.lizongbo.smpp.server.codec;

import org.apache.mina.common.attributekey;

import org.apache.mina.common.iobuffer;

import org.apache.mina.common.iosession;

import org.apache.mina.filter.codec.protocoldecoder;

import org.apache.mina.filter.codec.protocoldecoderoutput;

import com.lizongbo.smpp.badcommandidexception;

import com.lizongbo.smpp.message.smpppacket;

import com.lizongbo.smpp.util.smppio;

import com.lizongbo.smpp.util.packetfactory;

public class smppprotocoldecoder implements protocoldecoder else

while (buftmp.remaining() >= 4

&& buftmp.remaining() >= buftmp.getint(buftmp.position()))

}if (buftmp.hasremaining())

}catch (badcommandidexception ex)

}public void dispose(iosession session) throws exception

}[/code]

除錯日誌如下:

(乙個資料報被分為三段傳送,服務端收到之後重新組包解析的日誌)

listening on port a 5435

sessioncreated==(0×013e8d89: nio socket, server, /127.0.0.1:1188 => /127.0.0.1:5435)

run decode!!!

in.remaining() == 4

沒有不完整資料

資料報長69 buftmp.remaining() ==4

資料還不完整

剩餘資料儲存到session!!!4位元組 00:00:00:45

run decode!!!

in.remaining() == 8

尚有不完整資料:00:00:00:45

資料報長69 buftmp.remaining() ==12

資料還不完整

剩餘資料儲存到session!!!12位元組 00:00:00:45:80:00:00:00:00:00:00:00

run decode!!!

in.remaining() == 57

尚有不完整資料:00:00:00:45:80:00:00:00:00:00:00:00

資料報長69 buftmp.remaining() ==69

hexdata:00:00:00:45:80:00:00:00:00:00:00:00:00:00:00:7a

00:00:00:1d:68:74:74:70:3a:2f:2f:31:32:37:2e:30

2e:30:2e:31:3a:35:34:33:35:2f:58:64:70:70:59:61

6e:00:00:00:10:63:02:00:6d:00:04:65:63:68:6f:04

79:79:79:79:7a

(上面是 合併之後得到的資料報)

ps: 也可以使用apache mina 提供的statemachine來處理類似的問題。

vector的模擬實現

上一節部落格講述了vector常見介面的使用,今天主要是對vector這些介面進行模擬實現,下面是相關 include include includeusing namespace std namespace ty iterator end citerator cbegin const citera...

list的模擬實現

list是stl標準模板庫中的乙個容器,它實質上是乙個帶頭雙向迴圈鍊錶。這樣的好處是 插入 刪除資料時,不用判斷鍊錶是否為空,並且遍歷的時候找尾也很容易,只需要用 head prev就能實現。迭代器的作用就是為了讓容器的訪問像指標一樣可以實現 解引用,以及過載 的比較符。迭代器有兩種實現方式 1.原...

bind的模擬實現

var context context window var result 判斷是否有第二個引數 if arguments 1 else delete context.fn return result var foo function bar name,age bind 方法會建立乙個新的函式。當這...