转自 http://blog.csdn.net/chenxuegui1234/article/details/17981203
好吧,承接上篇文章,下面给出一个udp不可靠无连接的例子,他的次传送都是一个udp报文,不向上面文章中tcp是基于流的
代码:
Server:
- /**
- * 服务器端
- *
- * @author Joeson
- *
- */
- 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 Joeson
- */
- 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();
- }
- }