android連接netty
1. Qt C++與Android Netty之間傳輸位元組碼問題
1 技術棧結構
服務端是qt c++寫的,客戶端是android移動設備,程序語言為java。
2 技術流
android端連接伺服器,之間的通訊協議用protobuf,傳輸的是位元組碼流。qt :QByteArray; Java : byte[]數組
3 發送數據
Qt:
QTcpSocket conn;
QByteArray ba;
conn.write(ba.data(), ba.length());
Android:
Bootstrap bootstrap =new Bootstrap();
bootstrap.group(group).channel(NioSocketChannel.class)
.option(ChannelOption.TCP_NODELAY,true)
.handler(new ChannelInitializer() {
@Override
protected void initChannel(SocketChannel ch)throws Exception {
ch.pipeline()
.addLast(new ByteArrayEncoder())//這個很關鍵
.addLast(new ByteArrayDecoder())//這個很關鍵
.addLast(new NettyHandler(new NettyHandler.HandlerCallback() {
@Override
public void onError() {
if(mListener !=null){
mListener.onError(ERROR_RECV);
}
}
@Override
public void onDataRecv(byte[] data) {
if(mListener !=null){
mListener.onRecvData(data);
}
}
}));
}
});
mChannelFuture =bootstrap.connect(host, port)
.addListener(future -> {
boolean isSuccess = future.isSuccess();
if(isSuccess ==true){
if(mListener !=null){
mListener.onConnectSuccess();
}
}else{
if(mListener !=null){
mListener.onConnectFail();
}
}
})
.sync();
}catch (Exception e){
e.printStackTrace();
group.shutdownGracefully();
if(mListener !=null){
mListener.onError(ERROR_CONNECT);
}
}
2. netty4 能不能運行在android上
jar
bootstrap = new
Bootstrap().setAllocator(PooledByteBufAllocator.config().DEFAULT).toString()).Final.0.0.d(".17;
}
}).17;ClientConnection"
return
channel.group(new
NioEventLoopGroup()).jar
netty-transport-4.DEFAULT);
bootstrap.jar
netty-codec-4.setAllocator(PooledByteBufAllocator;.config().jar
netty-handler-4;
解決傳輸文件的時候爆沒有sun
buf類的問題
channel.DEFAULT.Final,
PooledByteBufAllocator.0;
Log.17netty-buffer-4;
channel;NioSocketChannel>.Final.17.Final.Final.0.channelFactory(new
ChannelFactory<.0.17.jar
netty-common-4;
bootstrap;(){
@Override
public
NioSocketChannel newChannel() {
NioSocketChannel channel=new
NioSocketChannel();
可以用,你可以試試
huanglen 1-03 19:54
3. android 怎麼使用netty
Netty是由JBOSS提供的一個java開源框架。Netty提供非同步的、事件驅動的網路應用程序框架和工具,用以快速開發高性能、高可靠性的網路伺服器和客戶端程序。也就是說,Netty是一個基於NIO的客戶,伺服器端編程框架,它在socket的基礎上根據各種常用的應用協議又進一步封裝,提供更便利的介面。如果需要快速搭建一個C/S服務框架,那Netty過來用是沒錯。反過來你的情況是需要學習這個課程,你應該掌握基本的socket編程及其通信原理,所以學習時直接用socket編程比較好。也許哪一天,你靈感來了,編出一個比Netty更好的框架,一個更牛的軟體。
4. android中netty使用udp連接能發送數據,
我的也是,不知道怎麼回事,在普通java工程中去連接就沒問題,在android中就是連接超時
5. android 支持netty嗎
這個是支持的。
什麼是netty,有興趣的朋友可以google一下netty,可以知道這東東做什麼用,當然你也可以選擇mina,一樣的都是java nio框架.
選擇netty是支持protobuf(google內部使用頻率比較高的,之前的android源碼中內含有這一部分的代碼)協議,這樣可以解決網路編程中粘包(也可以理解成傳輸過程中長度的問題,有興趣可以看相關文章).
6. netty4 能不能運行在android上
Android端沒必要用Netty。Netty主要是解決伺服器開發的問題。~如果你認可我的回答,請及時點擊【採納為滿意回答】按鈕~~手機提問的朋友在客戶端右上角評價點【滿意】即可。~你的採納是我前進的動力~~O(∩_∩)O,記得好評和採納,互相幫助,謝謝。
7. 怎麼在android中調用netty的方法發送消息
javaScript函數中執行C#代碼中的函數: 方法一:1、首先建立一個按鈕,在後台將調用或處理的內容寫入button_click中; 2、在前台寫一個js函數,內容為document.getElementById("btn1").click(); 3、在前台或後台調用js函數,激發click事件,等於訪問後台c#函數; 方法二:1、函數聲明為public 後台代碼(把public改成protected也可以) public string ss() { return("a"); } 2、在html里用<%=fucntion()%>可以調用 前台腳本 <script language=javascript> var a = "<%=ss()%>"; alert(a); </script> 方法三:1、<script language="javascript"> <!-- function __doPostBack(eventTarget, eventArgument) { var theForm = document.Form1; //指runat=server的form theForm.__EVENTTARGET.value = eventTarget; theFrom.__EVENTARGUMENT.value = eventArgument; theForm.submit(); } --> </script> <input id="Button1" type="button" name="Button1" value="按鈕" onclick="javascript:__doPostBack('Button1','')"> 方法四:<script language="javascript"> function SubmitKeyClick() { if (event.keyCode == 13) { event.cancelBubble = true; event.returnValue = false; document.all.FunName.value="你要調用的函數名"; document.form[0].submit(); } } </script> <INPUT onkeypress="SubmitKeyClick()" id="aaa" type="text"> <input type="hidden" name="FunName"> 〈!--用來存儲你要調用的函數 --〉 在.CS里有: public Page_OnLoad() { if (!Page.IsPost()) { string strFunName=Request.Form["FunName"]!=null?Request.Form["FunName"]:""; //根據傳回來的值決定調用哪個函數 switch(strFunName) { case "enter()": enter() ; //調用該函數 break; case "其他": //調用其他函數 break; default: //調用默認函數 break; } } } public void enter() { //……比如計算某值 }
8. netty4 能不能運行在android上
netty一般都是在伺服器端運行的,android可以通過http請求訪問伺服器端,實現APP的開發
相比Netty3, Netty4有很多顯著的變化:
NioEventLoopGroup 是一個處理I/O操作的多線程事件環。即為Netty4里的線程池,在3.x里,一個Channel是由ChannelFactory創建的,同時新創建的Channel會自動注冊到一個隱藏的I/O線程。 4.0使用新的名為EventLoopGroup的介面來替換ChannelFactory,它由一個或多個EventLoop來構成。一個新的 Channel不會自動注冊到EventLoopGroup,但用戶可以顯式調用EventLoopGroup.register()來注冊。在Server端的Bootstrap參數中,有兩個EventLoopGroup,第一個通常稱為'boss',用於接收發來的連接請求。第二個稱為'worker',,用於處理boss接受並且注冊給worker的連接中的信息。
ChannelInitializer是一個特殊的handler,用於方便的配置用戶自定義的handler實現,如代碼中所示。在channelRegistered的生命周期中會觸發用戶復寫的initChannel(C ch)方法,並且在調用後會講自身從channelPipeline中移除。
9. Netty在Android中使用
在添加初始化 .addLast(new ChannelHandle(ConnectService.this)); 的ChannelHandle 類中重寫超時回調方法
連接失敗回調
連接錯誤回調
出現問題的原因2:沒有處理粘包拆包問題 解決方法:
添加包的接收處理: addLast(new SimpleProtocolDecoder()) 解包處理避免粘包的主要步驟是:1.解協議頭 2.解包長 3.讀指定的包長後返回