使用JAVA NIO实现的UDP client和server
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
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的更多相关文章
- 上机题目(0基础)- Java网络操作-Socket实现client和server端通信二(Java)
上一节实现了client像server端发送请求.本节将实现server端向client回传信息.实现原理非常easy,在原来的基础上.在server端实现输出流,在client实现输入流就可以,详细 ...
- 上机题目(0基础)- Java网络操作-Socket实现client和server端通信(Java)
非常多刚開始学习的人对于java网络通信不太熟悉.对相关概念也不太明确,这里我们主要实现一下socket通信,socket通信在java中应用十分广泛.比如QQ和MSN等都是基于socket通信的,什 ...
- java NIO经典实例
服务端: Loader.java package net.chatroom.server; public class Loader { public static void main(String[] ...
- Java NIO理解与使用
https://blog.csdn.net/qq_18860653/article/details/53406723 Netty的使用或许我们看着官网user guide还是很容易入门的.因为java ...
- java 连接Kafka报错java.nio.channels.ClosedChannelExcep
Java 客户端连接Kafka报如下错误 java.nio.channels.ClosedChannelExcep 是由于Kafka server.properties中的advertised.hos ...
- JAVA NIO异步通信框架MINA选型和使用的几个细节(概述入门,UDP, 心跳)
Apache MINA 2 是一个开发高性能和高可伸缩性网络应用程序的网络应用框架.它提供了一个抽象的事件驱动的异步 API,可以使用 TCP/IP.UDP/IP.串口和虚拟机内部的管道等传输方式.A ...
- Java nio Client端简单示例
java nio是一种基于Channel.Selector.Buffer的技术,它是一种非阻塞的IO实现方式 以下Client端示例 public class ClientNio { public s ...
- TCP/UDP client/server library for Java, 最好的java语言tcp udp 服务器客户端实现库
这个库andrdoi也可以用,而且是基于类的使用方式: 它支持类似聊天室的功能,即一个人说话,所有客户端都能收到,当然也支持点点通信.它还支持 RMI 的方式调用远程过程. https://githu ...
- Java NIO (转)
Java NIO提供了与标准IO不同的IO工作方式: Channels and Buffers(通道和缓冲区):标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(B ...
随机推荐
- hdu_4823_Energy Conversion
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4823 题意:中文题,很清楚,要注意的是乘起来会爆int 题解: #include<cstdio& ...
- CentOS 7 时区设置
设置时区同样, 在 CentOS 7 中, 引入了一个叫 timedatectl 的设置设置程序. 用法很简单: # timedatectl # 查看系统时间方面的各种状态 $timedatectl ...
- VB webbrowser 控件的应用(跨域 内嵌网页元素的访问)
自动登录财付通,难点在于会出现验证码,并且验证码页是在iframe元素下的,出于各种安全考虑,webbrowser控件不提供这种访问机制!当然,第一想到的是将这个网页拿出来,可是输入完毕验证码后,点击 ...
- hiho 1015 KMP
input 1<=T<=20 string1 1<=strlen(string1)<=1e4 string2 2<=strlen(string2)<=1e6 out ...
- Java中常见的5种WEB服务器介绍
这篇文章主要介绍了Java中常见的5种WEB服务器介绍,它们分别是Tomcat.Resin.JBoss.WebSphere.WebLogic,需要的朋友可以参考下 Web服务器是运行及发布Web应用的 ...
- 转载 Deep learning:四(logistic regression练习)
前言: 本节来练习下logistic regression相关内容,参考的资料为网页:http://openclassroom.stanford.edu/MainFolder/DocumentPage ...
- 动画——animation(2)
日常中,我们使用的动画来源有两个方面—— 第一个,自己去定义. 通过@keyframes去定义即可,格式如下: @keyframe animatename{ 0%{ //这里面写初始的对象的css样式 ...
- 学习笔记——工厂模式Factory
Product是我们所需要获得的对象,一般的使用中,我们直接通过new获得新对象. 当需要大量获得对象时,每一次都new会很麻烦. <真菌世界>游戏中,一个星球上有很多树,一棵树会不断生成 ...
- 转:Jmeter进行分布式性能测试
由于Jmeter本身的瓶颈,当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至还会引起JAVA内存溢出的错误.要解决这个问题,可以使用分布式测试,运行多台机器运行所谓的 ...
- 转:LR性能测试结果样例分析 测试结果分析
LoadRunner性能测试结果分析是个复杂的过程,通常可以从结果摘要.并发数.平均事务响应时间.每秒点击数.业务成功率.系统资源.网页细分图.Web服务器资源.数据库服务器资源等几个方面分析,如图1 ...