专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » javaudp编程:在Java编程语言中实现UDP协议编程的思路方法 »正文

javaudp编程:在Java编程语言中实现UDP协议编程的思路方法

来源: 发布时间:星期一, 2009年2月23日 浏览:0次 评论:0

5V;t/X+RM%U2d9ST 什么是UDP协议
L;j(_TO6h?

E-R2SL"^(xvwJAVA中文站社区门户1p`ni6m!XR#l(B
UDP协议全称是用户数据报在网络中它和TCP协议样用于处理数据包在OSI模型中在第 4层——传输层处于IP协议UDP有不提供数据报分组、组装和不能对数据包排序缺点也就是说当报文发送的后是无法得知其是否安全完整到达 JAVA中文站社区门户`?i(C\!GEE


d)s/y K8C t5P 为什么要使用UDP JAVA中文站社区门户6HfY|!@ }'q"`

JAVA中文站社区门户y)l+@I0rXU
在选择使用协议时候选择UDP必须要谨慎在网络质量令人不十分满意环境下UDP协议数据包丢失会比较严重但是由于UDP特性:它不属于连接型协议因而具有资源消耗小处理速度快优点所以通常音频、视频和普通数据在传送时使用UDP较多它们即使偶尔丢失两个数据包也不会对接收结果产生太大影响比如我们聊天用ICQ和OICQ就是使用UDP协议 JAVA中文站社区门户_.Af[ql,{

JAVA中文站社区门户X a }!Vy;j
在Java中操纵UDP JAVA中文站社区门户;P{n h'te1wo0E1A


&g9l#E;t[BR&@ 使用位于JDK中Java.net包下DatagramSocket和DatagramPacket类可以非常方便地控制用户数据报文 JAVA中文站社区门户C#D}&s8E

JAVA中文站社区门户!e'R4IZx
在描述它们的前必须了解位于同个位置InetAddress类InetAddress实现了Java.io. Serializable接口不允许继承它用于描述和包装个Internet IP地址通过 3个思路方法返回InetAddress例子: JAVA中文站社区门户#h iV]1w

JAVA中文站社区门户3n-]NG%j U2@!|%G
getLocalhost:返回封装本地地址例子 JAVA中文站社区门户)J*Lyu {K


@a\{"|/A^(g5@ getAllByName(String host):返回封装Host地址InetAddress例子

i\Q u;`d8W
2_5t!cZ+l*ED getByName(String host):返回个封装Host地址例子其中Host可以是域名或者是个合法IP地址 JAVA中文站社区门户$[VVX5Mq

JAVA中文站社区门户"`4~;P[3B
DatagramSocket类用于创建接收和发送UDPSocket例子和Socket类依赖SocketImpl类DatagramSocket类实现也依靠专门为它设计DatagramScoketImplFactory类DatagramSocket类有3个构建器: JAVA中文站社区门户b&N8Ht4w%ZL

JAVA中文站社区门户kF6yP s}
DatagramSocket:创建例子这是个比较特殊使用方法通常用于客户端编程它并没有特定监听端口仅仅使用个临时 JAVA中文站社区门户*@5b)rG*D_


[ V f3yr.K;_pf S DatagramSocket( port):创建例子并固定监听Port端口报文

G#? UTwJAVA中文站社区门户CI%bk4hEC6\
DatagramSocket( port, InetAddress localAddr):这是个非常有用构建器台机器拥有多于个IP地址时候由它创建例子仅仅接收来自LocalAddr报文

:j/K4y+as8o5YJAVA中文站社区门户'ZaT S*J"}][i
值得注意在创建DatagramSocket类例子时如果端口已经被使用会产生个SocketException异常抛出并导致非法终止这个异常应该注意捕获DatagramSocket类最主要思路方法有4个:

?r1A C w*zJAVA中文站社区门户 dH4onf^s W
Receive(DatagramPacket d):接收数据报文到d中receive思路方法产生个“阻塞” JAVA中文站社区门户#Wq"lC4@ CC C(e


CZ:c1JvS Send(DatagramPacket d):发送报文d到目

8{ J8wE5O&`Bjz5AJAVA中文站社区门户kY:B)O"QBL
SetSoTimeout( timeout):设置超时时间单位为毫秒 JAVA中文站社区门户e+G.R*I@u^? { ab

JAVA中文站社区门户8ypz6r:xg
Close:关闭DatagramSocket在应用退出时候通常会主动释放资源关闭Socket但是由于异常地退出可能造成资源无法回收所以应该在完成时主动使用此思路方法关闭Socket或在捕获到异常抛出后关闭Socket

(\ I:y(sV*Y'L)w
e3F;}:OWGo “阻塞”是个专业名词它会产生个内部循环使暂停在这个地方直到个条件触发

2QI/TsU?-N-a4}^[JAVA中文站社区门户9_.j'MF8_V4yIP
DatagramPacket类用于处理报文它将Byte、目标地址、目标端口等数据包装成报文或者将报文拆卸成Byte应用在产生数据包是应该注意TCP/IP规定数据报文大小最多包含65507个通常主机接收548个字节但大多数平台能够支持8192字节大小报文DatagramPacket类构建器共有4个: JAVA中文站社区门户2gTB|5^#hB9j


%o$s,@f/GI A8Qm K DatagramPacket( buf, length, InetAddress addr, port):从Buf取出Length长数据创建数据包对象目标是Addr地址Port端口

evQmgJAVA中文站社区门户En/Q/gx fK
DatagramPacket( buf, off, length, InetAddress address, port):从Buf取出Off开始、Length长数据创建数据包对象目标是Addr地址Port端口

2n1A[3]U$_R G jJAVA中文站社区门户 J'a;Op[&Qp\
DatagramPacket( buf, off, length):将数据包中从Off开始、Length长数据装进Buf JAVA中文站社区门户4`,JR0{XM'F V8M

JAVA中文站社区门户3y8Uk9jI$n v Z1j*Q
DatagramPacket( buf, length):将数据包中Length长数据装进Buf

)H0O(U$`#EJAVA中文站社区门户+?B(@[cU
DatagramPacket类最重要思路方法就是getData它从例子中取得报文Byte编码 JAVA中文站社区门户#Qlq8[6F[H

JAVA中文站社区门户XMS QvZI{
简单例子介绍说明

j oO&Jq g8EPJAVA中文站社区门户)m#bta F
{接收数据服务器}

*K.S,z'OIjw2A
X4Q Wzu$jYZ buf = [1000];

:g%BQi*U
@}~-JZ DL h$`8] ~ DatagramSocket ds = DatagramSocket(12345);

vx2q^iDJAVA中文站社区门户1a @I4|Q(A
//开始监视12345端口

%muU,J6C%M
RJdL]'@8U DatagramPacket ip = DatagramPacket(buf, buf.length); JAVA中文站社区门户g!duKmq)UUos


6Co%U(FoU@3b //创建接收数据报例子 JAVA中文站社区门户#T&l8gU7zbK0U

JAVA中文站社区门户 ^#YE.e/J%G W
while (true) JAVA中文站社区门户!Qig0j w


&?2FC9S#n1w!M%zl3R W {

*Re S|%aRDJAVA中文站社区门户Y5ZF+^f
ds.receive(ip);

T.Yu ]R}JAVA中文站社区门户 o |w;X Y+a+C[
//阻塞直到收到数据报后将数据装入IP中 JAVA中文站社区门户:^Q|;_,LrL/Q


aRx#G&xG&] .out.prln( String(buf)); JAVA中文站社区门户5TJl+c2?i jdN

JAVA中文站社区门户v] y?\Ex_
}

l5Bm|4vJAVA中文站社区门户$N+n]O7Oop
{发送数据客户端}

4l$~[z;D'AGJAVA中文站社区门户#V2_L{`T
InetAddress target = InetAddress.getByName(“www.xxx.com“);

5bc%k5x#ovfxQk6Y
j F~!gO6vt7kd //得到目标机器地址例子 JAVA中文站社区门户 BBjt)qz


)JKiY$kdg DatagramSocket ds = DatagramSocket(9999);

'M](SI6A+LK
P K:tb#iA"E)} //从9999端口发送数据报

qn3s p-nS)O*S
i0q l'p'D String hello = “Hello, I am come in!”;

XH[|-A9K
O,a M"Mb/ZH&fm PS //要发送数据

4RXaw Fb's t2wnJAVA中文站社区门户Mh$A*E)d$Gl v
buf = hello.getBytes; JAVA中文站社区门户)\,N(i)^1l7[&YX

JAVA中文站社区门户cR J1k.p'M
//将数据转换成Byte类型 JAVA中文站社区门户~'q.~ yj*J [ m*~X


7CKU4WNWM3k4q op = DatagramPacket(buf, buf.length, target, 12345);

I)xQ2x{#Go_j)C;uJAVA中文站社区门户/C8YA2BX$V
//将BUF缓冲区中数据打包

/x @}F W$S4IoA(@cJAVA中文站社区门户`{9{F,Tr`
ds.send(op); JAVA中文站社区门户:j~T f Q h/? ] X

JAVA中文站社区门户x/[OE]
//发送数据

M+uF\o6s3KJAVA中文站社区门户#[ ZE+i q+QA2j~
ds.close; JAVA中文站社区门户-`q0n;\-w1p


2\*a)Q9ur{ //关闭连接

.P(upfY&p#p

TAG: Java JAVA java UDP协议 语言
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: