- 浏览: 1239111 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (193)
- ant/maven (6)
- algorithm (5)
- tomcat/weblogic/jboss (6)
- javascript/jquery (13)
- java (33)
- flex/flash (0)
- JPA/Hibernate/myBatis (18)
- java concurrent (7)
- test (2)
- windows/linux (6)
- java collection (7)
- design pattern (2)
- life/health (3)
- database (12)
- IDE (4)
- spring/ejb (20)
- html/css/ckeditor (7)
- jsp/servlet (3)
- java io (13)
- java security (4)
- jni (0)
- svn/git (2)
- english (2)
- java jmx (1)
- xml (1)
- struts/springmvc (9)
- middleware (2)
- cache (1)
- cglib (3)
最新评论
-
jlotusYo:
博主,真感谢。
Java 密码扩展无限制权限策略文件 -
senninha:
这个。。是api说明吧。。
ScheduledExecutorService 源码分析 -
zoutao2008:
请问大文件如何处理?按你这种方式的话,文件超过200M时就会报 ...
hessian系列之二:上传文件 -
lwj1113:
lwj1113 写道谢谢博主这么细致的demo;在系列五中通过 ...
myBatis系列之五:与Spring3集成 -
lwj1113:
谢谢博主这么细致的demo;在系列五中通过testng测试类跑 ...
myBatis系列之五:与Spring3集成
和TCP的SocketChannel类似,UDP的DatagramChannel能充分利用NIO的优势。
服务端:Selector, DatagramChannel, ByteBuffer
客户端:DatagramChannel, ByteBuffer
区别:
a. 服务端没有与TCP的ServerSocketChannel相对应的Channel,服务端和客户端之间更趋于平等,不过服务端的端口号还是固定的。
b. Selector在处理完读取操作后,会触发写操作:发送数据到客户端。
1. 服务端
2. 客户端
客户端连接服务器后,发送数据可以用write或send方法:
客户端没有连接服务器,需要用send方法指定目标地址:
服务端:Selector, DatagramChannel, ByteBuffer
客户端:DatagramChannel, ByteBuffer
区别:
a. 服务端没有与TCP的ServerSocketChannel相对应的Channel,服务端和客户端之间更趋于平等,不过服务端的端口号还是固定的。
b. Selector在处理完读取操作后,会触发写操作:发送数据到客户端。
1. 服务端
public class UDPEchoServerSelector { private static final int TIMEOUT = 4000; // 超时 (毫秒) private static final int CAPACITY = 255; public static void main(String[] args) throws IOException { args = new String[1]; args[0] = "4451"; int servPort = Integer.parseInt(args[0]); Selector sel = Selector.open(); // 创建选择器,可以处理多路通道。 DatagramChannel channel = DatagramChannel.open(); channel.configureBlocking(false); channel.socket().bind(new InetSocketAddress(servPort)); // 通道关联的socket绑定地址 channel.register(sel, SelectionKey.OP_READ, new ClientData()); while (true) { // 持续运行,接收和返回数据 if (sel.select(TIMEOUT) == 0) { System.out.println("No I/O needs to be processed"); continue; } Iterator<SelectionKey> iter = sel.selectedKeys().iterator(); // 获取可操作的选择键集合 while (iter.hasNext()) { SelectionKey key = iter.next(); // 键为位掩码 if (key.isReadable()) { // 客户端有数据发送过来 handleRead(key); } if (key.isValid() && key.isWritable()) { // 通道正常,且客户端需要响应 handleWrite(key); } iter.remove(); // 从集合中移除选择键 } } } private static void handleRead(SelectionKey key) throws IOException { DatagramChannel channel = (DatagramChannel) key.channel(); ClientData clntDat = (ClientData) key.attachment(); clntDat.buffer.clear(); clntDat.clientAddress = channel.receive(clntDat.buffer); // 获取客户端的地址,用以发送响应 if (clntDat.clientAddress != null) { // 接收到数据 key.interestOps(SelectionKey.OP_WRITE); // 关注客户端读取响应 } } private static void handleWrite(SelectionKey key) throws IOException { DatagramChannel channel = (DatagramChannel) key.channel(); ClientData clntDat = (ClientData) key.attachment(); clntDat.buffer.flip(); // 从起始位置开始发送 int bytesSent = channel.send(clntDat.buffer, clntDat.clientAddress); if (bytesSent != 0) { key.interestOps(SelectionKey.OP_READ); // 关注客户端发送数据 } } public static class ClientData { public SocketAddress clientAddress; public ByteBuffer buffer = ByteBuffer.allocate(CAPACITY); } }
2. 客户端
public class UDPEchoClient { private static final int CAPACITY = 255; private static final String UTF8 = "UTF-8"; public static void main(String[] args) throws IOException { args = new String[2]; args[0] = "localhost"; args[1] = "4451"; String servName = args[0]; int servPort = Integer.parseInt(args[1]); DatagramChannel clntChan = DatagramChannel.open(); clntChan.configureBlocking(false); clntChan.connect(new InetSocketAddress(servName, servPort)); ByteBuffer sentBuffer = ByteBuffer.wrap("Hello UDP".getBytes(UTF8)); int bytesSent = clntChan.write(sentBuffer); // 向服务器发送数据 System.out.println("UDP client sent " + bytesSent + " bytes"); ByteBuffer recvBuffer = ByteBuffer.allocate(CAPACITY); clntChan.receive(recvBuffer); // 读取响应 recvBuffer.flip(); System.out.println("UDP client received: " + new String(recvBuffer.array(), UTF8)); } }
客户端连接服务器后,发送数据可以用write或send方法:
... clntChan.connect(new InetSocketAddress(servName, servPort)); ... int bytesSent = clntChan.write(sentBuffer);
... clntChan.connect(new InetSocketAddress(servName, servPort)); ... int bytesSent = clntChan.send(sentBuffer, new InetSocketAddress(servName, servPort)); // 发送地址必须和前面的连接地址相同,否则报java.lang.IllegalArgumentException: Connected address not equal to target address
客户端没有连接服务器,需要用send方法指定目标地址:
... int bytesSent = clntChan.send(sentBuffer, new InetSocketAddress(servName, servPort)); // 使用write方法会报java.nio.channels.NotYetConnectedException
发表评论
-
Netty系列之二、Netty组件
2014-10-12 19:55 0Netty主要由以下几个组件构成: Bootstrap o ... -
Netty系列之二:传输方式
2014-09-17 22:35 0NIO (Non-blocking I/O) io.netty ... -
Java正则表达式实例
2014-08-25 22:50 1901题目: 有两个文件context.txt和words ... -
quartz系列之九:存储
2014-08-05 13:16 0这里以1.8.x为例: 任务 ... -
JVM 四种引用
2014-04-24 19:56 17291. 强引用 指通过普通 ... -
Proxy 源码分析
2014-04-21 10:47 0public class Proxy implements ... -
Matcher 源码分析
2014-04-15 14:45 0首先看下接口: public interface Matc ... -
BTrace 使用
2014-03-20 18:03 0简介 Btrace (Byte Trace)是Sun推出的一款 ... -
NIO Socket 编程
2014-04-11 22:48 1618Java NIO (Nonblocking IO)解决了常规I ... -
hessian系列之二:上传文件
2014-02-17 17:16 6160hessian较早版本通过 byte[] 进行文件传输;4.0 ... -
hessian系列之三:与Spring集成
2014-02-17 20:21 17824Spring封装了hessian客户端和服务端的通用代码,把实 ... -
hessian系列之一:Hello world
2014-01-06 20:51 2265Hessian是一个Web Service的轻量级二进制协议, ... -
XStream:自定义转换器
2013-12-30 22:47 0XStream是一款不错的oxm (Object-XML ma ... -
Http连接工具类
2013-12-28 16:13 0public class HttpConnUtil { ... -
Integer源码分析
2013-12-26 19:59 0private static String toU ... -
全排序
2013-12-23 21:02 0写一个函数, 如 foo(String str), 打印出 s ... -
logback系列之四:输出日志到不同文件
2013-12-03 16:25 68776logback系列之一:输出日志到控制台 logback系列之 ... -
Properties 源码分析
2013-11-26 10:32 01. Properties类扩展了Hashtable,用来保存 ... -
logback系列之三:输出日志到文件(滚动)
2013-11-16 23:37 64294logback系列之一:输出日志到控制台 logback系列之 ... -
logback系列之二:输出日志到文件
2013-11-15 15:20 30246logback系列之一:输出日志到控制台 logback系列之 ...
相关推荐
非常详细地讲解了NIO中的缓冲区、通道、选择器、编码,以及使用Socket技术实现TCP/IP和UDP编程,细化到了演示全部SocketOption的特性,这对理解基于NIO和Socket技术为基础所开发的NIO框架是非常有好处的,本书以案例...
主要介绍了Java NIO实例UDP发送接收数据代码分享,分享了客户端和服务端完整代码,小编觉得还是挺不错的,共需要的朋友参考。
主要讲解Java Socket编程中NIO UDP的实例,希望能给大家做一个参考。
主要介绍了java 基础知识之网络通信总结的相关资料,包括TCP通信、UDP通信、多播以及NIO,需要的朋友可以参考下
socket的tcp/udp(多播) nio的tcp/udp mina 均有服务端/客服端
t-io是基于aio(nio2)的网络编程框架,和netty属于同类,但t-io更注重开发一线工程师的感受,提供了大量和业务相关的API。基于t-io来开发IM、TCP私有协议、RPC、游戏服务器端、推送服务、实时监控、物联网、UDP、...
本书内容全面涵盖了从网络基础知识到远程方法调用(RMI)等各方面的内容,书中章集涉及到TCP和UDP socket 、服务器socket、URL和URI、组播以及特殊用途的API(如JavaMail)等等。本书展示了如何使用JSSE编写安全的...
事实上,我对这个数据并不感到惊讶,根据我5年多的NIO编程经验,通过选择合适的NIO框架,加上高性能的压缩二进制编解码技术,精 心的设计Reactor线程模型,达到上述性能指标是完全有可能的。 下面我们就一起来看下...
它极大地简化和简化了TCP和UDP套接字服务器等网络编程。 “快速简便”并不意味着最终的应用程序将遭受可维护性或性能问题的困扰。Netty经过精心设计,结合了许多协议(例如FTP,SMTP,HTTP以及各种基于二进制和...
java网络编程包括socket tcp/udp io/nio讲解 http协议 jdbc rmi java的安全框架等知识
Java网络编程:Applet、Socket/TCP/UDP、NIO、RMI、CORBA。Java高级特性:反射、泛型、注释符、自动装箱和拆箱、枚举类、可变参数、可变返回类型、增强循环、静态导入。随书附赠光盘内容为《Java高手真经(编程基础卷...
本资料提供的是用Socket编程实现聊天程序。 有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,...
javanio.zip 23.NIO非阻塞通信(Socket/UDP实例、简单聊天系统) javarmi.zip 24.RMI编程(HelloWorld例、计算器实例) javacorba.zip 25.Corba编程(HelloWorld例、计算器实例) 第6部分(4个程序包) java...
javanio.zip 23.NIO非阻塞通信(Socket/UDP实例、简单聊天系统) javarmi.zip 24.RMI编程(HelloWorld例、计算器实例) javacorba.zip 25.Corba编程(HelloWorld例、计算器实例) 第6部分(4个程序包) java...
Java网络编程精讲,主要涉及Socket,ServerSocket,NIO,http协议,tcp,udp精讲等等
Socket编程:基于Socket套接字,通过TCP或UDP协议进行网络通信。通过创建Socket对象,程序可以在网络上进行数据传输和通信。 URL和URLConnection:Java提供了java.net.URL和java.net.URLConnection等类,用于访问...
本书内容全面,涵盖了从网络基础知识到远程方法调用(RMI)等各方面的内容,书中章节涉及到TCP和UDP socket、服务器socket、URL和URI、组播以及特殊用途的API(如JavaMail)等等。本书展示了如何使用JSSE编写安全的...
Java网络编程:Applet、Socket/TCP/UDP、NIO、RMI、CORBA。Java高级特性:反射、泛型、注释符、自动装箱和拆箱、枚举类、可变参数、可变返回类型、增强循环、静态导入。随书附赠光盘内容为《Java高手真经(编程基础卷...
Java网络编程:Applet、Socket/TCP/UDP、NIO、RMI、CORBA。Java高级特性:反射、泛型、注释符、自动装箱和拆箱、枚举类、可变参数、可变返回类型、增强循环、静态导入。随书附赠光盘内容为《Java高手真经(编程基础卷...