0
点赞
收藏
分享

微信扫一扫

android socket select 编程demo

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++;
}*/
}
}

举报

相关推荐

0 条评论