anroid開發Socket編程實例步驟


前言:

移動開發少不了網絡連接,我們開發者最主要的網絡編程方式就是socket和http編程,首先簡單介紹一下兩者的切和聯系。

一.首先大家都知道socket是對tcp/ip/udp協議的封裝,我們程序員只管調用即可,http是應用層協議,其底層也是tcp協議,主要解決包裝數據。

二.http是請求和響應,不能主動向客戶端發送數據,而socket編程是雙向的,既可以主動向客戶端發送數據也可以是請求響應的關系


步驟:

1.初始化,連接服務器

selector = Selector.open();// 打開觸發器
socketChannel = SocketChannel.open();// 打開通道
FileLog.LogInfo("//打開通道", "//打開通道");
boolean isConnected = socketChannel
.connect(new InetSocketAddress(ComConstants.mVideoIP,
ComConstants.mVideoPort));// 鏈接通道


FileLog.LogInfo("//鏈接通道", "//鏈接通道");
socketChannel.configureBlocking(false);// 非阻塞模式
SelectionKey key = socketChannel.register(selector,
SelectionKey.OP_READ);// 注冊有數據來的時候觸發器
if (!isConnected) {
// 如果連接還在嘗試中,則注冊connect事件的監聽. connect成功以后會出發connect事件.
key.interestOps(SelectionKey.OP_CONNECT);
}

2.開啟讀取數據的通道

我采用的while循環,不停地去讀取是否有服務端數據發來

while (!((SocketService) context).close&&vApp.isNetworkConnected(context)) {
try {
// 阻塞,等待事件發生,或者1秒超時. num為發生事件的數量.
/*
* if(selector!=null){ Log.e("selector",
* "selector!=null"); }
*/
if (selector != null && selector.isOpen()) {
// Log.e("selector", "selector.isOpen()");
int num = selector.select(1000);
if (num == 0) {
idleCounter++;
if (idleCounter > 10) {
// Log.e("startAgain", "startAgain235");
startAgain();//重連服務
}
continue;
} else {
idleCounter = 0;
}
Log.e("selector","------------------selector.selectedKeys()");
Set<SelectionKey> keys = selector.selectedKeys();
Iterator<SelectionKey> it = keys.iterator();
while (it.hasNext()) {
SelectionKey key = it.next();
it.remove();
if (key.isConnectable()) {
SocketChannel sc = (SocketChannel) key
.channel();
if (sc.isConnectionPending()) {
sc.finishConnect();// 完成連接的建立(TCP三次握手)
}
}
if (key.isReadable()) {
Log.e("selector", "isReadable");
ProcessReceive((SocketChannel) key
.channel());//處理接收到的數據
// keys.remove(key);
}
}


}

3.發起請求

ByteBuffer bbBuffer = ByteBuffer.wrap(dataBuildHelper
.getTokenPacket(MessageType, token, recevieTokens,
messageContent));
while (bbBuffer.hasRemaining()) {


if (socketChannel != null) {
// FileLog.LogInfo("SyncTaskClient,writeBase",
// "socketChannel != null");


socketChannel.write(bbBuffer);
}
}



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com