編輯:關於Android編程
博主曾經對netty4的helloword很感興趣,也曾單純的寫過一個小小的聊天室java代碼,現在重新來看看,浏覽了這位牛人的博客 點擊去看看
我覺得受益匪淺,故拿來分享。
這次是在android上使用netty作為客戶端,來與服務端相互通訊的小事例,純粹的helloworld,效果就是在android程序中發送一個消息到服務端,然後服務端也回一個消息給客戶端,很簡單的demo,.大牛看了可不要吐槽啊!
1.demo結構
2.服務端代碼:
Server.java
package org.jan.netty.demo; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioServerSocketChannel; public class MyHelloServer { private static final int PORT = 7878; public static void main(String[] args) { EventLoopGroup parentGroup = new NioEventLoopGroup(); EventLoopGroup childrenGroup = new NioEventLoopGroup(); try { ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(parentGroup, childrenGroup); serverBootstrap.channel(NioServerSocketChannel.class); //添加工作線程 serverBootstrap.childHandler(new MyHelloServerInitializer()); // 服務器綁定端口監聽 ChannelFuture cf = serverBootstrap.bind(PORT).sync(); // 監聽服務器關閉監聽 cf.channel().closeFuture().sync(); } catch (Exception e) { e.printStackTrace(); } finally { parentGroup.shutdownGracefully(); childrenGroup.shutdownGracefully(); } } }
MyHelloServerHandler.java
package org.jan.netty.demo; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import java.net.InetAddress; import java.nio.charset.Charset; public class MyHelloServerHanler extends SimpleChannelInboundHandler{ @Override protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { String recStr = new String(msg.getBytes(), Charset.forName(UTF-8)); //收到消息直接打印輸出 System.out.println(ctx.channel().remoteAddress()+ say :+recStr); //返回客戶端 ctx.writeAndFlush(Received your message! ); } @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { System.out.println(RamoteAddress: +ctx.channel().remoteAddress()+ active!); // ctx.writeAndFlush(Welcome to + InetAddress.getLocalHost().getHostName() + 's service! ); ctx.writeAndFlush(我是服務端,我是服務端! ); super.channelActive(ctx); } }
3.android客戶端代碼:
package org.jan.nio.exapmle; import io.netty.bootstrap.Bootstrap; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import java.net.InetSocketAddress; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class ClientActivity extends Activity { private static final String TAG = MainActivity; public static final String HOST = 192.168.50.110; public static int PORT = 7878; private NioEventLoopGroup group; private Button sendButton; private static Context context; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); context = this; sendButton = (Button) findViewById(R.id.netty_send_button); sendButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { connected(); } }); } // 連接到Socket服務端 private void connected() { new Thread() { @Override public void run() { group = new NioEventLoopGroup(); try { // Client服務啟動器 3.x的ClientBootstrap // 改為Bootstrap,且構造函數變化很大,這裡用無參構造。 Bootstrap bootstrap = new Bootstrap(); // 指定channel類型 bootstrap.channel(NioSocketChannel.class); // 指定Handler bootstrap.handler(new MyClientInitializer(context)); // 指定EventLoopGroup bootstrap.group(group); // 連接到目標IP的8000端口的服務端 Channel channel = bootstrap.connect(new InetSocketAddress(HOST, PORT)).sync().channel(); channel.writeAndFlush(我是客戶端,我是客戶端! ); channel.read(); } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); } @Override protected void onDestroy() { super.onDestroy(); if(group!=null){ group.shutdownGracefully(); } } }
GridView跟ListView一樣是多控件布局。實現九宮圖是最方便的。還是先看看圖,沒圖說個雞雞是不是如上圖,是一種應用方式,在每個格子裡面,放入應用圖標,和顯示應用
我們開發一個APP在上傳應用市場之前,有時候會遇到要根據不同平台打多個apk包的問題。由於Android的應用市場比較多,主流的應用市場就有應用寶,百度手機助手,豌豆莢等
堅果手機相信受到了很多朋友的關注,說不定就已經有不少朋友入手了。我們手機在滑動窗口的時候因為設置不同可能會導致窗口動畫縮放的速度不同,大家就就會覺得自己的手
本文實例為大家分享了視頻播放器的兩種方式,供大家參考,具體內容如下1)、SurfaceView在布局文件中<?xml version=1.0 encodin