JAVA udp不阻塞_Java NIO——6 基于非阻塞编程UDP NIO的例子

好吧,承接上篇文章,下面给出一个upd不可靠无连接的例子,他的次传送都是一个upd报文,不向上面文章中tcp是基于流的

代码:

Server:

/**

* 服务器端

*

* @author chenxuegui

*

*/

public class UDPServer

{

DatagramChannel channel;

Selector selector;

public void work()

{

try

{

// 打开一个UDP Channel

channel = DatagramChannel.open();

// 设定为非阻塞通道

channel.configureBlocking(false);

// 绑定端口

channel.socket().bind(new InetSocketAddress(8080));

// 打开一个选择器

selector = Selector.open();

channel.register(selector, SelectionKey.OP_READ);

} catch (Exception e)

{

e.printStackTrace();

}

ByteBuffer byteBuffer = ByteBuffer.allocate(65536);

while (true)

{

try

{

// 进行选择

int n = selector.select();

if (n > 0)

{

// 获取以选择的键的集合

Iterator iterator = selector.selectedKeys().iterator();

while (iterator.hasNext())

{

SelectionKey key = (SelectionKey) iterator.next();

// 必须手动删除

iterator.remove();

if (key.isReadable())

{

DatagramChannel datagramChannel = (DatagramChannel) key

.channel();

byteBuffer.clear();

// 读取

InetSocketAddress address = (InetSocketAddress) datagramChannel

.receive(byteBuffer);

System.out.println(new String(byteBuffer.array()));

// 删除缓冲区中的数据

byteBuffer.clear();

String message = "data come from server";

byteBuffer.put(message.getBytes());

byteBuffer.flip();

// 发送数据

datagramChannel.send(byteBuffer, address);

}

}

}

} catch (Exception e)

{

e.printStackTrace();

}

}

}

public static void main(String[] args)

{

new UDPServer().work();

}

}

客户端:

/**

* 客户端

*

* @author chenxuegui

*/

public class UDPClient

{

DatagramChannel channel;

Selector selector;

public void work()

{

try

{

// 开启一个通道

channel = DatagramChannel.open();

channel.configureBlocking(false);

SocketAddress sa = new InetSocketAddress("localhost", 8080);

channel.connect(sa);

} catch (Exception e)

{

e.printStackTrace();

}

try

{

selector = Selector.open();

channel.register(selector, SelectionKey.OP_READ);

channel.write(Charset.defaultCharset().encode("data come from client"));

} catch (Exception e)

{

e.printStackTrace();

}

ByteBuffer byteBuffer = ByteBuffer.allocate(100);

while (true)

{

try

{

int n = selector.select();

if (n > 0)

{

Iterator iterator = selector.selectedKeys().iterator();

while (iterator.hasNext())

{

SelectionKey key = (SelectionKey) iterator.next();

iterator.remove();

if (key.isReadable())

{

channel = (DatagramChannel) key.channel();

channel.read(byteBuffer);

System.out.println(new String(byteBuffer.array()));

byteBuffer.clear();

channel.write(Charset.defaultCharset().encode(

"data come from client"));

}

}

}

} catch (Exception e)

{

e.printStackTrace();

}

}

}

public static void main(String[] args)

{

new UDPClient().work();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值