andriod 学习 step by step (二) Android TCP 客户端 实现

因为项目上需要实现一个TCP Client 端;在网上找好多例子基本上都是阻塞方式完成;

我的实现例子:由Activity 及sever 来实现,在sever 创建一个线程来监听接受数据。收到数据,通过广播发送给Activity;

服务端我没有去实现,你可以下载TCP Socket 调试工具v2.2;创建个9005端口;客户端:访问的IP为10.0.2.2

AnetTest.java

1   /* *
2     *   Copyright   2010   archfree
3     *    
4     */
5   package   com . archfree . demo;
6  
7   import   android . app . Activity;
8   import   android . content . BroadcastReceiver;
9   import   android . content . ComponentName;
10  import   android . content . Context;
11  import   android . content . Intent;
12  import   android . content . IntentFilter;
13  import   android . content . ServiceConnection;
14 
15  import   android . os . Bundle;
16  import   android . os . IBinder;
17  import   android . util . Log;
18  import   android . view . View;
19  import   android . view . View . OnClickListener;
20  import   android . widget . Button;
21  import   android . widget . EditText;
22  import   android . widget . TextView;
23 
24  public   class   AnetTest   extends   Activity   {
25 
26      /* *
27        *   通过ServiceConnection的内部类实现来连接Service和Activity
28        *  
29        */
30      public   static   final   String   TAG   =   " AnetTest " ;
31      private   static   final   boolean   DEBUG   =   true ; //   false
32      private   String   msg   =   " " ;
33      private   UpdateReceiver   mReceiver;
34      private   Context   mContext;
35      private   ReceiveMessage   mReceiveMessage;
36 
37      //   实现一个   BroadcastReceiver,用于接收指定的   Broadcast
38      public   class   UpdateReceiver   extends   BroadcastReceiver   {
39 
40          @Override
41          public   void   onReceive(Context   context,   Intent   intent)   {
42              if   (DEBUG)
43                  Log . d(TAG,   " onReceive:   "   +   intent);
44              msg   =   intent . getStringExtra( " msg " );
45              System . out . println( " recv: "   +   msg);
46              //   System.out.println();
47              ((EditText)   findViewById(R . id . tv_recv)) . append(msg   +   " /n " );
48 
49          }
50 
51      }
52 
53      private   ServiceConnection   serviceConnection   =   new   ServiceConnection()   {
54 
55          @Override
56          public   void   onServiceConnected(ComponentName   name,   IBinder   service)   {
57 
58              mReceiveMessage   =   ((ReceiveMessage . LocalBinder)   service)
59                      . getService();
60              if   (DEBUG)
61                  Log . d(TAG,   " on   serivce   connected " );
62 
63          }
64 
65          @Override
66          public   void   onServiceDisconnected(ComponentName   name)   {
67              mReceiveMessage   =   null ;
68          }
69      } ;
70 
71      /* *   Called   when   the   activity   is   first   created.   */
72      @Override
73      public   void   onCreate(Bundle   savedInstanceState)   {
74          super . onCreate(savedInstanceState);
75          setContentView(R . layout . main);
76 
77          //   实例化自定义的   BroadcastReceiver
78          mReceiver   =   new   UpdateReceiver();
79          IntentFilter   filter   =   new   IntentFilter();
80          //     BroadcastReceiver   指定   action   ,使之用于接收同   action   的广播
81          filter . addAction( " com.archfree.demo.msg " );
82 
83          //   以编程方式注册   BroadcastReceiver   。配置方式注册   BroadcastReceiver   的例子见
84          //   AndroidManifest.xml   文件
85          //   一般在   OnStart   时注册,在   OnStop   时取消注册
86          this . registerReceiver(mReceiver,   filter);
87 
88          mContext   =   AnetTest . this ;
89          /* *
90            *   Button   bn_conn   bn_send   bn_bind   bn_unbind
91            */
92 
93          //   Button   bn_conn   =   (Button)   findViewById(R.id.bn_conn);
94          Button   bn_send   =   (Button)   findViewById(R . id . bn_send);
95          Button   bn_bind   =   (Button)   findViewById(R . id . bn_bind);
96          Button   bn_unbind   =   (Button)   findViewById(R . id . bn_unbind);
97          EditText   tv_recv   =   (EditText)   findViewById(R . id . tv_recv);
98          /* *
99            *   EditText   et_send
100           */
101
102         EditText   et_send   =   (EditText)   findViewById(R . id . et_send);
103
104         /* *
105           *   bn_send   on   click
106           */
107
108         bn_send . setOnClickListener( new   OnClickListener()   {
109
110             public   void   onClick(View   arg0)   {
111                 //   TODO
112                 ((EditText)   findViewById(R . id . tv_recv)) . clearComposingText();
113
114                 mReceiveMessage
115                         . SendMessageToServer( " 0001058512250000190010900005300010001354758032278512           460029807503542                           0613408000011               " );
116             }
117         } );
118
119         /* *
120           *   bn_bind   on   click
121           */
122         bn_bind . setOnClickListener( new   OnClickListener()   {
123
124             public   void   onClick(View   arg0)   {
125                 //   TODO
126                 Intent   i   =   new   Intent();
127                 Bundle   bundle   =   new   Bundle();
128                 bundle . putString( " chatmessage " ,
129                         ((EditText)   findViewById(R . id . et_send)) . getText()
130                                 . toString());
131                 i . putExtras(bundle);
132                 System . out . println( "   send     onclick " );
133                 bindService( new   Intent( " com.archfree.demo.ReceiveMessage " ),
134                         serviceConnection,   BIND_AUTO_CREATE);
135
136             }
137         } );
138         /* *
139           *   bn_unbind   on   click
140           */
141         bn_unbind . setOnClickListener( new   OnClickListener()   {
142
143             public   void   onClick(View   arg0)   {
144                 //   TODO
145                 mContext . unbindService(serviceConnection);
146
147             }
148         } );
149         /* *
150           *   Activity和本地服务交互,需要使用bind和unbind方法
151           *   */
152
153     }
154
155     @Override
156     protected   void   onDestroy()   {
157         //   TODO   Auto-generated   method   stub
158         super . onDestroy();
159         unbindService(serviceConnection);
160         unregisterReceiver(mReceiver);
161     }
162
163 }
=============================================================================================

ReceiveMessage.java 参考网络资源,修改;

1   package   com . archfree . demo;
2  
3   import   java . io . IOException;
4   import   java . net . InetSocketAddress;
5   import   java . nio . ByteBuffer;
6   import   java . nio . CharBuffer;
7   import   java . nio . channels . SocketChannel;
8   import   java . nio . charset . CharacterCodingException;
9   import   java . nio . charset . Charset;
10  import   java . nio . charset . CharsetDecoder;
11  import   android . app . Notification;
12  import   android . app . NotificationManager;
13  import   android . app . PendingIntent;
14  import   android . app . Service;
15  import   android . content . Context;
16  import   android . content . Intent;
17  import   android . os . Binder;
18  import   android . os . IBinder;
19 
20  public   class   ReceiveMessage   extends   Service   {
21 
22      //   @Override
23      //   public   int   onStartCommand(Intent   intent,   int   flags,   int   startId)   {
24      //   //   TODO   Auto-generated   method   stub
25      //   return   super.onStartCommand(intent,   flags,   startId);
26      //   }
27 
28      private   SocketChannel   client   =   null ;
29      private   InetSocketAddress   isa   =   null ;
30      private   String   message   =   " " ;
31 
32      public   void   onCreate()   {
33          System . out . println( " -----   onCreate--------- " );
34          super . onCreate();
35 
36          ConnectToServer();
37          StartServerListener();
38 
39      }
40 
41      public   void   onDestroy()   {
42          super . onDestroy();
43          DisConnectToServer();
44      }
45 
46      public   void   onStart(Intent   intent,   int   startId)   {
47          System . out . println( " -----   onStart--------- " );
48          super . onStart(intent,   startId);
49      }
50 
51      /*
52        *   IBinder方法   ,   LocalBinder   类,mBinder接口这三项用于
53        *   Activity进行Service的绑定,点击发送消息按钮之后触发绑定   并通过Intent将Activity中的EditText的值
54        *   传送到Service中向服务器发送
55        */
56      public   IBinder   onBind(Intent   intent)   {
57          System . out . println( " -----   onBind--------- " );
58 
59  //         message   =   intent.getStringExtra("chatmessage");
60  //         if   (message.length()   >   0)   {
61  //             SendMessageToServer(message);
62  //         }
63          return   mBinder;
64      }
65 
66      public   class   LocalBinder   extends   Binder   {
67          ReceiveMessage   getService()   {
68              return   ReceiveMessage . this ;
69          }
70      }
71 
72      private   final   IBinder   mBinder   =   new   LocalBinder();
73 
74      //   用于链接服务器端
75      public   void   ConnectToServer()   {
76          try   {
77 
78              client   =   SocketChannel . open();
79              // isa   =   new   InetSocketAddress("10.0.2.2",   9005);
80              isa   =   new   InetSocketAddress( " 211.141.230.246 " ,   6666 );
81              client . connect(isa);
82              client . configureBlocking( false );
83 
84          }   catch   (IOException   e)   {
85              //   TODO   Auto-generated   catch   block
86              e . printStackTrace();
87 
88          }
89      }
90 
91      //   断开与服务器端的链接
92      public   void   DisConnectToServer()   {
93          try   {
94              client . close();
95          }   catch   (IOException   e)   {
96              //   TODO   Auto-generated   catch   block
97              e . printStackTrace();
98          }
99      }
100
101     //   启动服务器端的监听线程,从Server端接收消息
102     public   void   StartServerListener()   {
103         ServerListener   a   =   new   ServerListener();
104         a . start();
105     }
106
107     //   向Server端发送消息
108     public   void   SendMessageToServer(String   msg)   {
109
110         System . out . println( " Send: "   +   msg);
111
112         try   {
113             ByteBuffer   bytebuf   =   ByteBuffer . allocate( 1024 );
114             bytebuf   =   ByteBuffer . wrap(msg . getBytes( " UTF-8 " ));
115             client . write(bytebuf);
116             bytebuf . flip();
117         }   catch   (IOException   e)   {
118             //   TODO   Auto-generated   catch   block
119             e . printStackTrace();
120             System . out . println( "   SendMessageToServer   IOException=== " );
121
122         }
123     }
124
125     private   void   shownotification(String   tab)   {
126         System . out . println( " shownotification===== "   +   tab);
127         NotificationManager   barmanager   =   (NotificationManager)   getSystemService(Context . NOTIFICATION_SERVICE);
128         Notification   msg   =   new   Notification(
129                 android . R . drawable . stat_notify_chat,   " A   Message   Coming! " ,
130                 System . currentTimeMillis());
131         PendingIntent   contentIntent   =   PendingIntent . getActivity( this ,   0 ,
132                 new   Intent( this ,   AnetTest . class ),   PendingIntent . FLAG_ONE_SHOT);
133         msg . setLatestEventInfo( this ,   " Message " ,   " Message: "   +   tab,   contentIntent);
134         barmanager . notify( 0 ,   msg);
135     }
136     //   发送广播信息
137     private   void   sendMsg(String   msg) {
138         //   指定广播目标的   action   (注:指定了此   action     receiver   会接收此广播)
139         Intent   intent   =   new   Intent( " com.archfree.demo.msg " );
140         //   需要传递的参数
141         intent . putExtra( " msg " ,   msg);
142         //   发送广播
143         this . sendBroadcast(intent);
144     }
145
146     private   class   ServerListener   extends   Thread   {
147         // private     ByteBuffer   buf   =   ByteBuffer.allocate(1024);
148         public   void   run()   {
149
150             try   {
151                 //   无线循环,监听服务器,如果有不为空的信息送达,则更新Activity的UI
152                 while   ( true )   {
153                     ByteBuffer   buf   =   ByteBuffer . allocate( 1024 );
154                     // buf.clear();
155                     client . read(buf);
156                     buf . flip();
157                     Charset   charset   =   Charset . forName( " UTF-8 " );
158                     CharsetDecoder   decoder   =   charset . newDecoder();
159                     CharBuffer   charBuffer;
160                     charBuffer   =   decoder . decode(buf);
161                     String   result   =   charBuffer . toString();
162                     if   (result . length ()   >   0 )
163                     { //   recvData(result);
164                         sendMsg(result);
165                         // System.out.println("+++++="+result);
166                    
167                         // shownotification(result);
168                     }
169                    
170
171                     //   System.out.println("++++++++++++++++++="+result);
172                 }
173             }   catch   (CharacterCodingException   e)   {
174                 //   TODO   Auto-generated   catch   block
175                 e . printStackTrace();
176             }   catch   (IOException   e)   {
177                 //   TODO   Auto-generated   catch   block
178                 e . printStackTrace();
179             }
180         }
181     }
182
183 }
=================================================================

AndroidManifest.xml

< ?xml version = " 1.0 " encoding = " utf-8 " ? >
< manifest xmlns:android = " http://schemas.android.com/apk/res/android "
    package = " com.archfree.demo " android:versionCode = " 1 "
    android:versionName = " 1.0 " >
    < application android:icon = " @drawable/icon " android:label = " @string/app_name " >
        < activity android:name = " .AnetTest " android:label = " @string/app_name " >
            < intent-filter >
                < action android:name = " android.intent.action.MAIN "   / >
                < category android:name = " android.intent.category.LAUNCHER "   / >
10             < /intent-filter >
11         < /activity >
12        
13         < service android:name = " ReceiveMessage " >
14             < intent-filter >
15                 < action android:name = " com.archfree.demo.ReceiveMessage "   / >
16             < /intent-filter >
17         < /service >
18        
20         < receiver android:name = " .MyBootReceiver " >
21             < intent-filter >
22                 < action android:name = " android.intent.action.BOOT_COMPLETED "   / >
23             < /intent-filter >
24         < /receiver >
25     < /application >
26    
27     < uses-permission android:name = " android.permission.INTERNET "   / >
28    
29     < uses-permission android:name = " android.permission.WRITE_EXTERNAL_STORAGE "   / >
30    
31     < uses-permission android:name = " android.permission.RECEIVE_BOOT_COMPLETED "   / >
32     < uses-sdk android:minSdkVersion = " 8 "   / >
33
34 < /manifest >  

layout/main.xm

< ?xml version = " 1.0 " encoding = " utf-8 " ? >
< AbsoluteLayout android:id = " @+id/widget0 "
    android:layout _width= " fill_parent " android:layout _height= " fill_parent "
    xmlns:android = " http://schemas.android.com/apk/res/android " >
    < EditText android:id = " @+id/et_send " android:layout _width= " 184px "
        android:layout _height= " 50px " android:text = " EditText " android:textSize = " 18sp "
        android:layout _x= " 54px " android:layout _y= " 32px " >
    < /EditText >
    < EditText android:id = " @+id/tv_recv " android:layout _width= " 254px "
10         android:layout _height= " 125px " android:text = " " android:textSize = " 18sp "
11         android:layout _x= " 51px " android:layout _y= " 97px " > < /EditText >
12
13
14
15     < Button android:id = " @+id/bn_unbind " android:layout _width= " 192px "
16         android:layout _height= " wrap_content " android:text = " 退出服务 "
17         android:layout _x= " 60px " android:layout _y= " 352px " >
18     < /Button >
19     < Button android:id = " @+id/bn_send " android:layout _width= " 192px "
20         android:layout _height= " wrap_content " android:text = " 发送请求 "
21         android:layout _x= " 60px " android:layout _y= " 232px " >
22     < /Button >
23     < Button android:id = " @+id/bn_bind " android:layout _width= " 192px "
24         android:layout _height= " wrap_content " android:text = " 登入服务 "
25         android:layout _x= " 60px " android:layout _y= " 292px " >
26     < /Button >
27     < TextView android:id = " @+id/widget32 " android:layout _width= " wrap_content "
28         android:layout _height= " wrap_content " android:text = " 填充发送内容 "
29         android:layout _x= " 13px " android:layout _y= " 7px " >
30     < /TextView >
31 < /AbsoluteLayout >
32
 
运行时,先登入服务器,再发送数据。
完成后退出;
希望对你有参考意义,你发现实现的问题,请留言;部分代码参考网络,感谢原作;

你可能感兴趣的:(Android)