///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

client.java

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

package udp.nio;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.util.Arrays;
import java.util.Iterator;

import test.PublicTool;

public class UDPClient {
static DatagramChannel channel;
static Selector selector;
SocketAddress sa;
static ByteBuffer byteBuffer1;
static ByteBuffer byteBuffer2 = ByteBuffer.allocate(100);

public static void run() {
try {
channel = DatagramChannel.open();
channel.configureBlocking(false);
channel.socket().bind(new InetSocketAddress(10000));
} catch (Exception e) {
e.printStackTrace();
}
try {
selector = Selector.open();
channel.register(selector, SelectionKey.OP_READ);
byte[] ret = { 0x7C, 0x13, 0x1F, 0x47, 0x0E, 0x03, 0x06, 0x0F,
0x13, 0x30, 0x00, 0x08, 0x00, 0x00, 0x00, 0x55,
(byte) 0xAA, 0x70, 0x7A };
byteBuffer1 = ByteBuffer.wrap(ret);
channel.send(byteBuffer1, new InetSocketAddress("192.168.1.200",
10000));
} catch (Exception e) {
e.printStackTrace();
}

int num = 0;
while (num < 2) {
try {
System.out.println("1111");
int n = selector.select();
System.out.println(n);
if (n > 0) {
Iterator iterator = selector.selectedKeys().iterator();
System.out.println(iterator);
while (iterator.hasNext()) {
SelectionKey key = (SelectionKey) iterator.next();
iterator.remove();
if (key.isReadable()) {
channel = (DatagramChannel) key.channel();
channel.receive(byteBuffer2);
byte[] all = byteBuffer2.array();
byte[] receiveBuf = new byte[all[1]];
System.arraycopy(all, 0, receiveBuf, 0, all[1]);
PublicTool.printHexString(receiveBuf);
byteBuffer2.clear();
if(receiveBuf == null || receiveBuf == new byte[0]);break;
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
channel.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

public static void main(String[] args) {
while (true) {
run();
try {
Thread.sleep(1000l);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

server

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

package udp.nio;

import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.util.Arrays;
import java.util.Iterator;

import test.PublicTool;

public class UDPServer
{
DatagramChannel channel;

Selector selector;

public void work()
{
try
{
// 打开一个UDP Channel
channel = DatagramChannel.open();

// 设定为非阻塞通道
channel.configureBlocking(false);
// 绑定端口
channel.socket().bind(new InetSocketAddress(10000));

// 打开一个选择器
selector = Selector.open();
channel.register(selector, SelectionKey.OP_READ);
} catch (Exception e)
{
e.printStackTrace();
}

ByteBuffer byteBuffer = ByteBuffer.allocate(19);
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);

PublicTool.printHexString(byteBuffer.array());

// 删除缓冲区中的数据
byteBuffer.clear();
byte[] ret = {0x55, (byte) 0xAA, 0x70, 0x7A };

byteBuffer.put(ret);

byteBuffer.flip();

// 发送数据
datagramChannel.send(byteBuffer, address);
}
}
}
} catch (Exception e)
{
e.printStackTrace();
}
}

}

public static void main(String[] args)
{
new UDPServer().work();

}

}

使用JAVA NIO实现的UDP client和server的更多相关文章

  1. 上机题目(0基础)- Java网络操作-Socket实现client和server端通信二(Java)

    上一节实现了client像server端发送请求.本节将实现server端向client回传信息.实现原理非常easy,在原来的基础上.在server端实现输出流,在client实现输入流就可以,详细 ...

  2. 上机题目(0基础)- Java网络操作-Socket实现client和server端通信(Java)

    非常多刚開始学习的人对于java网络通信不太熟悉.对相关概念也不太明确,这里我们主要实现一下socket通信,socket通信在java中应用十分广泛.比如QQ和MSN等都是基于socket通信的,什 ...

  3. java NIO经典实例

    服务端: Loader.java package net.chatroom.server; public class Loader { public static void main(String[] ...

  4. Java NIO理解与使用

    https://blog.csdn.net/qq_18860653/article/details/53406723 Netty的使用或许我们看着官网user guide还是很容易入门的.因为java ...

  5. java 连接Kafka报错java.nio.channels.ClosedChannelExcep

    Java 客户端连接Kafka报如下错误 java.nio.channels.ClosedChannelExcep 是由于Kafka server.properties中的advertised.hos ...

  6. JAVA NIO异步通信框架MINA选型和使用的几个细节(概述入门,UDP, 心跳)

    Apache MINA 2 是一个开发高性能和高可伸缩性网络应用程序的网络应用框架.它提供了一个抽象的事件驱动的异步 API,可以使用 TCP/IP.UDP/IP.串口和虚拟机内部的管道等传输方式.A ...

  7. Java nio Client端简单示例

    java nio是一种基于Channel.Selector.Buffer的技术,它是一种非阻塞的IO实现方式 以下Client端示例 public class ClientNio { public s ...

  8. TCP/UDP client/server library for Java, 最好的java语言tcp udp 服务器客户端实现库

    这个库andrdoi也可以用,而且是基于类的使用方式: 它支持类似聊天室的功能,即一个人说话,所有客户端都能收到,当然也支持点点通信.它还支持 RMI 的方式调用远程过程. https://githu ...

  9. Java NIO (转)

    Java NIO提供了与标准IO不同的IO工作方式: Channels and Buffers(通道和缓冲区):标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(B ...

随机推荐

  1. 感知哈希算法的java实现

    一.原理讲解      实现这种功能的关键技术叫做"感知哈希算法"(Perceptual Hash Algorithm), 意思是为图片生成一个指纹(字符串格式), 两张图片的指纹 ...

  2. 忘记oracle用户名密码怎么办?

    忘记oracle用户名密码怎么办? 忘记了安装时设置的用户名和密码怎么办?查了下网上的资料,终于解决了! 方法一: 首先进入sqlplus:进入的方式有两种,一种是通过cmd命令台输入sqlplus, ...

  3. js基础和工具库

    /* * 作者: 胡乐 * 2015/4/18 * js 基础 和 工具库 * * * */ //根据获取对象 function hGetId(id){ return document.getElem ...

  4. hdu_2224_The shortest path(dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2224 题意:双调欧几里德旅行商经典问题,找一条最短回路使得该路经过所有的点 题解:dp[i][j]=d ...

  5. WPF之让ListView中的CheckBox居中显示

    第一步:在资源中定义一个居中的样式: <Window.Resources> <Style x:Key="ListViewItemStyle" TargetType ...

  6. JNI调用问题(部分机型崩溃)

    1.今日测试发现在部分手机上游戏会崩溃,通过logcat日志发现是jni调用问题(我猜测) 错误日志中有如下语句: trying to work around app JNI bugs, but di ...

  7. Windows任务管理器中内存使用、虚拟内存区别及与页面文件的关系

    原文地址:Windows任务管理器中内存使用.虚拟内存区别及与页面文件的关系 虚拟内存(VirtualMemory)是Windows管理所有可用内存的方式.对于32位Windows系统,每个进程所用到 ...

  8. Android OpenGL ES(三)OpenGL ES API 命名习惯 .

    OpenGL ES是个跨平台的3D图形开发包规范,最常见的实现是采用C语言实现的,Android OpenGL ES 实现上是使用Java 语言对底层的C接口进行了封装,因此在android.open ...

  9. android下m、mm、mmm编译命令的使用

    android下m.mm.mmm编译命令的使用 通过查看android源码目录下的build/envsetup.sh文件,可知: - m:       Makes from the top of th ...

  10. JS的className,字体放大缩小

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...