在Java语言应用中实现UDP协议编程的方法
什么是UDP协议 打造最好的电脑自学交流论坛: S% r# ?/ T/ t: a$ s+ ?* \
8 y8 ^9 E* C9 a/ L1 k& Y打造最好的电脑自学交流论坛4 Y- \+ a' l% n/ e$ f2 N
打造最好的电脑自学交流论坛% f8 W. l7 L) J6 S# g/ r2 O" q
UDP协议的全称是用户数据报,在网络中它与TCP协议一样用于处理数据包。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。 打造最好的电脑自学交流论坛. N w4 t3 w4 p3 U
1 B% G' M2 b/ [" U4 o8 R
; w& ^9 C3 t; j7 y1 z9 l6 O电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站' S, P: ^; h. X% @3 `
为什么要使用UDP
+ f3 x7 p- p- r# V# v @我爱电脑技术社区--打造最好的电脑技术自学交流平台
* c9 O! _" h* h6 M! I' J电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站6 T- f# ?. H# O+ P' N) A9 k! g3 P9 c
0 R; U. }7 e5 }1 E4 S我爱电脑技术社区--打造最好的电脑技术自学交流平台在选择使用协议的时候,选择UDP必须要谨慎。在网络质量令人不十分满意的环境下,UDP协议数据包丢失会比较严重。但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如我们聊天用的ICQ和OICQ就是使用的UDP协议。 我爱电脑技术论坛6 S, m. R& u- ]+ h
7 u; D4 L% a( o1 l2 ?/ f* a$ b我爱电脑技术社区--打造最好的电脑技术自学交流平台
4 S6 J1 O0 |1 C! w3 d( ?& p
% n# Y- q# u. h' `$ \电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站在Java中操纵UDP 我爱电脑技术社区--打造最好的电脑技术自学交流平台) p& c2 V( C7 \
* f+ ]* i+ X; v* H6 c1 U) G电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
1 k! R l: P' Y' R: R$ P' h电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
2 {' I6 A0 y# f4 G* v2 l使用位于JDK中Java.net包下的DatagramSocket和DatagramPacket类,可以非常方便地控制用户数据报文。 " P+ @, O/ y& Y/ R4 H5 l0 h
8 T0 I' X3 _$ r' l+ p6 r我爱电脑技术社区--打造最好的电脑技术自学交流平台0 u9 U+ m- Z( f4 S/ a: v
打造最好的电脑自学交流论坛( M, |, U! u9 Y' S8 Y
在描述它们之前,必须了解位于同一个位置的InetAddress类。InetAddress实现了Java.io. Serializable接口,不允许继承。它用于描述和包装一个Internet IP地址,通过三个方法返回InetAddress实例:
& `- o, a4 n# H! i1 M5 p
( A0 E7 D) X' h电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
1 p" X6 V7 P5 e' T$ J2 zwww.520diannao.com我爱电脑技术论坛% r. U% k5 P/ F/ |( A
getLocalhost():返回封装本地地址的实例。
! a% _# P- w- d q3 L# Y电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
8 c. R+ W1 e2 `电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
! ^+ E2 H' V% l4 D我爱电脑技术论坛电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站7 E7 Y8 W7 _) E
getAllByName(String host):返回封装Host地址的InetAddress实例数组。 . F9 w; X, t* Z- x& o8 k$ Y; I9 c
# s, L4 j7 Y0 x. Wwww.520diannao.com
1 u/ v' m+ b6 G( z$ P打造最好的电脑自学交流论坛www.520diannao.com1 R3 X; d9 q6 V4 x5 T! D# f$ T7 G
getByName(String host):返回一个封装Host地址的实例。其中,Host可以是域名或者是一个合法的IP地址。 www.520diannao.com+ ?6 i& {* J e3 N3 j
我爱电脑技术论坛( L! n; ]& Q7 f$ }
打造最好的电脑自学交流论坛; u q3 j/ D l" f6 H
: A4 d& ~5 q0 k* A8 Z, H打造最好的电脑自学交流论坛DatagramSocket类用于创建接收和发送UDP的Socket实例。和Socket类依赖SocketImpl类一样,DatagramSocket类的实现也依靠专门为它设计的DatagramScoketImplFactory类。DatagramSocket类有3个构建器:
0 k9 y4 D$ ^) B+ B- _# h0 Lwww.520diannao.com
' D$ N3 v: K6 b$ Ewww.520diannao.com
0 i1 d6 {8 \, p& i我爱电脑技术论坛
- \: V0 y4 B# ?% |) N9 n3 S我爱电脑技术论坛DatagramSocket():创建实例。这是个比较特殊的用法,通常用于客户端编程,它并没有特定监听的端口,仅仅使用一个临时的。 # m4 m& M4 Q# Y* @$ C+ t% T' q
我爱电脑技术社区--打造最好的电脑技术自学交流平台8 C! p4 m; S# V, _. J7 g9 ~1 k7 _
' t' F0 l3 y: U0 H打造最好的电脑自学交流论坛
( ~( i$ z: |: h9 R3 vDatagramSocket(int port):创建实例,并固定监听Port端口的报文。 我爱电脑技术社区--打造最好的电脑技术自学交流平台0 [" I5 h. g5 \ ]: ]8 m
; y0 q$ ] j/ c g; [% p电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
4 @9 q" O% e6 s+ Q我爱电脑技术论坛我爱电脑技术论坛0 b. e( E U \/ R( R1 k: I1 S, M
DatagramSocket(int port, InetAddress localAddr):这是个非常有用的构建器,当一台机器拥有多于一个IP地址的时候,由它创建的实例仅仅接收来自LocalAddr的报文。
$ E6 m8 h' B& p- c6 z4 {' d0 p) n我爱电脑技术论坛
$ @. W: k% } u7 r; V我爱电脑技术论坛
7 j* g- b; n4 \
6 K) I4 o B* D. E) V8 hwww.520diannao.com值得注意的是,在创建DatagramSocket类实例时,如果端口已经被使用,会产生一个SocketException的异常抛出,并导致程序非法终止,这个异常应该注意捕获。DatagramSocket类最主要的方法有4个:
9 i9 W- j$ [ T. h/ _9 z我爱电脑技术社区--打造最好的电脑技术自学交流平台
( |& @$ _: m3 G% |8 k b: d我爱电脑技术社区--打造最好的电脑技术自学交流平台
$ D/ I0 W3 ~8 c* f" F9 U3 t" {电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
# f2 A. g6 l+ X7 N7 ?& yReceive(DatagramPacket d):接收数据报文到d中。receive方法产生一个“阻塞”。 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站1 W5 p9 Y$ @$ n) I/ s! Z& s
www.520diannao.com+ E! {! h" i, F+ X* n
我爱电脑技术社区--打造最好的电脑技术自学交流平台1 k0 r' i- Z: A* @" G& v
我爱电脑技术论坛+ g; e K/ Y6 ] e
Send(DatagramPacket d):发送报文d到目的地。 6 `7 h/ x6 m5 I+ d# r+ N' u4 n. P
电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站0 k$ Z& k. a, @" Q! i
www.520diannao.com" w1 z. H: i! ^: b
0 r1 H) X* Y6 @ g0 ~- [打造最好的电脑自学交流论坛SetSoTimeout(int timeout):设置超时时间,单位为毫秒。 我爱电脑技术论坛- h2 @, s( J! \2 L' y
我爱电脑技术社区--打造最好的电脑技术自学交流平台( V- D" [$ r! P$ R$ ?/ X
6 s- h K2 P! b- S电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
0 X4 c% Z# b2 ?% l2 p我爱电脑技术论坛Close():关闭DatagramSocket。在应用程序退出的时候,通常会主动释放资源,关闭Socket,但是由于异常地退出可能造成资源无法回收。所以,应该在程序完成时,主动使用此方法关闭Socket,或在捕获到异常抛出后关闭Socket。
# P5 j: t6 q& ^! p1 t我爱电脑技术社区--打造最好的电脑技术自学交流平台
/ D" Q: s# N3 G4 q电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
$ D$ u4 i6 ` {) e- ~6 Nwww.520diannao.com
: o3 N0 z& j5 g: u, b, X, E7 J, ]打造最好的电脑自学交流论坛“阻塞”是一个专业名词,它会产生一个内部循环,使程序暂停在这个地方,直到一个条件触发。
$ @, B5 Z" ]' l* E我爱电脑技术论坛我爱电脑技术论坛7 B/ L4 Z8 Y8 `/ Y
% x+ ^# k7 @3 ~7 m" t5 V; [
C6 S. P. F/ k# m: v我爱电脑技术社区--打造最好的电脑技术自学交流平台DatagramPacket类用于处理报文,它将Byte数组、目标地址、目标端口等数据包装成报文或者将报文拆卸成Byte数组。应用程序在产生数据包是应该注意,TCP/IP规定数据报文大小最多包含65507个,通常主机接收548个字节,但大多数平台能够支持8192字节大小的报文。DatagramPacket类的构建器共有4个:
/ g6 v& E, {% h6 K打造最好的电脑自学交流论坛打造最好的电脑自学交流论坛' ?; r3 W- M" G# [# A
& l4 \$ I' k/ A( u电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
# m) l- g; v4 h' L9 F+ k电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站DatagramPacket(byte[] buf, int length, InetAddress addr, int port):从Buf数组中,取出Length长的数据创建数据包对象,目标是Addr地址,Port端口。
" s+ x3 z; S, y9 |' t+ b! P% O电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站我爱电脑技术论坛/ w8 J& E7 M J: w" \( V
, p9 ?+ v0 y" ~& S" \我爱电脑技术论坛, G: c4 Q& Z1 s. M! m& O" y9 x
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port):从Buf数组中,取出Offset开始的、Length长的数据创建数据包对象,目标是Addr地址,Port端口。