您的位置:首页 > 移动开发 > Android开发

android socket select 编程demo

2013-09-30 15:01 441 查看
AndroidMenifest.xml 权限:

    <uses-permission android:name="android.permission.INTERNET"/>

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>

    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>

package com.pyks.testsocket;

import java.io.IOException;

import java.net.InetSocketAddress;

import java.net.ServerSocket;

import java.nio.ByteBuffer;

import java.nio.channels.SelectionKey;

import java.nio.channels.Selector;

import java.nio.channels.ServerSocketChannel;

import java.nio.channels.SocketChannel;

import java.util.Iterator;

import java.util.Set;

import android.app.Activity;

import android.content.Context;

import android.net.wifi.WifiInfo;

import android.net.wifi.WifiManager;

import android.os.Bundle;

import android.view.Menu;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener {
private TextView tv;

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        

        initView();

    }

    private void initView()

    {

     tv = (TextView) findViewById(R.id.textview);

    

     Button btn1 = (Button) findViewById(R.id.button1);

     btn1.setOnClickListener(this);

    

     Button btn2 = (Button) findViewById(R.id.button2);

     btn2.setOnClickListener(this);

    }

    

    @Override
public void onClick(View v) {
switch (v.getId())
{
case R.id.button1:
new Thread(new TCPServerThread()).start();
break;

case R.id.button2:
new Thread(new TCPClientThread()).start();
break;
}
}

    

    @Override

    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.activity_main, menu);

        return true;

    }

    

    // =================== TCP =========================

    class TCPServerThread implements Runnable

    {
@Override
public void run() {
try {
startTCPServer();
} catch (IOException e) {
e.printStackTrace();
}
}

    }

    

    class TCPClientThread implements Runnable

    {
@Override
public void run() {
try {
startTCPClient();
} catch (IOException e) {
e.printStackTrace();
}
}

    }

    

    private String intToIp(int i)  

    {

     return (i & 0xFF)+ "." + ((i >> 8 ) & 0xFF) + "." + ((i >> 16 ) & 0xFF) +"."+((i >> 24 ) & 0xFF);

   }  

    

    

    private int PORT = 6001;

    private void startTCPServer() throws IOException

    {

     // get wifi ip

     WifiManager wifimanage=(WifiManager) getSystemService(Context.WIFI_SERVICE);//获取WifiManager 

    

     WifiInfo wifiinfo= wifimanage.getConnectionInfo();  

       

     String ip=intToIp(wifiinfo.getIpAddress());  

     System.out.println("==============> ip = " + ip);

       

     //将获取的int转为真正的ip地址,参考的网上的,修改了下  

       

     ServerSocketChannel serverChannel = ServerSocketChannel.open();

     serverChannel.configureBlocking(false);

     System.out.println("channel = " + serverChannel);

    

     ServerSocket socket = serverChannel.socket();

     System.out.println("socket = " + socket);

    

     InetSocketAddress inetSocket = new InetSocketAddress(PORT);

     socket.bind(inetSocket);

    

     Selector selector = Selector.open();

     // register channel to selector

     SelectionKey key = serverChannel.register(selector,  SelectionKey.OP_ACCEPT);

    

     int rspIndex = 1;

     while (true)

     {

     // check ready channel

     int readyChannels = selector.select();

     if (0 == readyChannels)

     continue;

    

     Set selectKeys = selector.selectedKeys();

     Iterator keyIterator = selectKeys.iterator();

     while (keyIterator.hasNext())

     {

     SelectionKey key1 = (SelectionKey) keyIterator.next();

    

    

     if (key1.isAcceptable())

     {

     // 接受 Client 的连接

     System.out.println("some client is acceptted...");

     SocketChannel clientChannel = serverChannel.accept();

     clientChannel.configureBlocking(false);

     clientChannel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);

     }

     else if (!key.isValid()) 

     {

     keyIterator.remove();

     continue;

     }

     if (key1.isConnectable())

     {

     System.out.println("some client is connected...");

//     serverChannel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);

     }

     else if (key1.isReadable())

     {

     // 读取 Client 发来的消息

     System.out.println("some client is readable...");

    

     SocketChannel socketChannelNew = (SocketChannel)key1.channel();

         ByteBuffer bytebuffer = ByteBuffer.allocateDirect(100);

         int len=socketChannelNew.read(bytebuffer);

         

         System.out.println("len = " + len);

         bytebuffer.flip();

         byte[] recv = new byte[64];

         bytebuffer.get(recv, 0, len);

         System.out.println("读取到: " + new String(recv).trim());

         

         // 如何是长链接则不能关闭

//         socketChannelNew.close();

     }

     else if (key1.isWritable())

     {

     // 发送消息给 client

     System.out.println("some client is writable...");

     SocketChannel channel = (SocketChannel) key1.channel();

     ByteBuffer buf = ByteBuffer.allocate(100);

     buf.put(("rsp from server " + rspIndex).getBytes());

     buf.flip();

         
channel.write(buf);  

         
 

         
 buf.clear();

         
 

         
 rspIndex++;

     }

    

     try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

    

     // 移除

     keyIterator.remove();

     }

     }

    }

    

    private void startTCPClient() throws IOException

    {

     SocketChannel channel = SocketChannel.open();

     channel.configureBlocking(false);

    

     InetSocketAddress remote=new InetSocketAddress("127.0.0.1", PORT);

     channel.connect(remote);

    

     int i=0;

      try 

      {

        while (!channel.finishConnect()) 

        {

        
Thread.sleep(1000);

        
i++;
         System.out.println("连接中。。。");
         if (i > 5) 
          break;
         
         if (i <= 5)
         
System.out.println("连接成功!");

        }
  } 

      catch (Exception e)

      {
   System.out.println("连接失败");
   return;
  }

      

      Selector selector = Selector.open();

      SelectionKey key = channel.register(selector,  SelectionKey.OP_READ | SelectionKey.OP_WRITE);

      int index = 1;

      ByteBuffer bufferClient=ByteBuffer.allocate(100);

      while (true)

      {

      int ready = selector.select();

      if (0 == ready)

      continue;

     

      Set keys = selector.selectedKeys();

      Iterator it = keys.iterator();

      while (it.hasNext())

      {

      SelectionKey key2 = (SelectionKey) it.next();

      if (key2.isReadable())

      {

      // 接收 server 发来的消息

      System.out.println("client reading...");

    

     SocketChannel channel2 = (SocketChannel)key2.channel();

         ByteBuffer bytebuffer = ByteBuffer.allocateDirect(100);

         int len=channel2.read(bytebuffer);

         

         System.out.println("len = " + len);

         bytebuffer.flip();

         byte[] recv = new byte[64];

         bytebuffer.get(recv, 0, len);

         System.out.println("读取到: " + new String(recv).trim());

      }

      else if (key2.isWritable())

      {

      // 不停的往 server 发送消息

      System.out.println("client writing...");

     

      bufferClient.put(("hello from client " + index).getBytes());

          
 bufferClient.flip();

          
 channel.write(bufferClient);  

          
 

          
 bufferClient.clear();

          
 index++;

      }

     

      try 
        
{
    Thread.sleep(1000);
        
 } 
        
 catch (InterruptedException e) 
        
 {
    e.printStackTrace();
        
 }

     

      it.remove();

      }

      }

      

/*      int index = 1;

      ByteBuffer bufferClient=ByteBuffer.allocate(100);

      while (index < 20)

      {
      bufferClient.put(("hello from client " + index).getBytes());
      bufferClient.flip();
      channel.write(bufferClient);  
      try 
      {
Thread.sleep(1000);
      } 
      catch (InterruptedException e) 
      {
e.printStackTrace();
      }
      
      bufferClient.clear();
      index++;

      }*/

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息