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++;
}*/
}
}
<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++;
}*/
}
}
相关文章推荐
- Android 网络编程 Socket Http
- 【Android学习】socket长连接,数据粘包问题
- please select android sdk
- Socket学习之select最简版服务器
- [编转]Android localsocket 的基础和使用实践: 02
- Android 基于Socket的聊天应用(二)
- android socket nio 聊天实现
- 【android】Socket简单用法
- 调试FSL Android GPS学习select和epoll的用法
- Linux网络编程 -- select/epoll得知socket有数据可读,如何判断数据全部被读取完毕? .
- Android-Socket多线程应用(聊天室客户端、Handler的简单使用)
- socket select()用法
- Android中socket的应用
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
- Android网络应用之Socket(一)
- socket编程之select()
- android实现socket连接(客户端)
- python select實現非阻塞socket
- 增大Linux的socket最大连接数(针对select,要编译内核)
- android socket wifi 连接PC实现简单的PPT控制器(源码)