赛迪网 > IT技术 Java > Java读书频道-中
  IT资讯搜索
 
IT产品搜索
[程序开发][网管世界][网络安全][数据库技术]
[操作系统][嘉宾聊天·在线访谈][活动集锦]
[精彩专题][Symantec专区][订阅IT技术周刊]
[开发论坛][网管论坛][安全论坛][数据库论坛]
[操作系统论坛][Sybase专区][IBM dW技术专区]
[病毒求助][病毒与漏洞播报][文档·源码下载]

Java2 参考大全:第18章 网络 (9)

发布时间:2006.06.29 01:17     来源:清华大学出版社    作者:Herbert Schildt 著 张玉清 吴溥峰等 译

18.9 数 据 报
对于你的大多数网络需求,你会对TCP/IP型网络很满意。它提供了有序的、可预测和可靠的信息包数据流。但是,这样做的代价也很大。TCP包含很多在拥挤的网络中处理拥塞控制的复杂算法以及信息丢失的悲观的预测。这导致了一个效率很差的传输数据方式。数据报是一种可选的替换方法。数据报(Datagrams)是在机器间传递的信息包,它有些像从一个训练有素但是很盲目的捕手投出一记有力的传球给三垒。一旦数据报被释放给它们预定的目标,不保证它们一定到达目的地,甚至不保证一定存在数据的接收者。同样,数据报被接受时,不保证它在传输过程不受损坏,不保证发送它的机器仍在那儿等待响应。Java通过两个类实现UDP协议顶层的数据报:DatagramPacket对象是数据容器,DatagramSocket是用来发送和接受DatagramPackets的机制。
18.9.1 DatagramPacket
DatagramPackets 可以用四个构造函数中的一个创建。第一个构造函数指定了一个接收数据的缓冲区和信息包的容量大小。它通过DatagramSocket接收数据。第二种形式允许你在存储数据的缓冲区中指定一个偏移量。第三种形式指定了一个用于DatagramSocket决定信息包将被送往何处的目标地址和端口。第四种形式从数据中指定的偏移量位置开始传输数据包。想象前两种形式是建立在“盒内”的,后两种形式形成了填塞物,并为一个信封注明了地址。下面是四个构造函数:
DatagramPacket(byte data[ ], int size)
DatagramPacket(byte data[ ], int offset, int size)
DatagramPacket(byte data[ ], int size, InetAddress ipAddress, int port)
DatagramPacket(byte data[ ], int offset, int size, InetAddress ipAddress,
int port)
存在几种方法可获取DatagramPacket内部状态。它们对信息包的目标地址和端口号以及原始数据和数据长度有完全的使用权,下面是它们的概述:
InetAddress getAddress( ) 返回目标文件InetAddress,一般用于发送。
Int getPort( ) 返回端口号。
byte[ ] getData( ) 返回包含在数据包中的字节数组数据。多用于在接收数据之后从数据包来检索数据。
Int getLength( ) 返回包含在将从getData( )方法返回的字节数组中有效数据长度。通常它与整个字节数组长度不等。
18.9.2 数据报服务器和客户
下面的例子实现了一个非常简单的联网通信的客户和服务器。消息被写入服务器的窗口并通过网络写入客户端,在此它们被显示。
// Demonstrate Datagrams.
import java.net.*;
class WriteServer {
public static int serverPort = 666;
public static int clientPort = 999;
public static int buffer_size = 1024;
public static DatagramSocket ds;
public static byte buffer[] = new byte[buffer_size];
public static void TheServer() throws Exception {
int pos=0;
while (true) {
int c = System.in.read();
switch (c) {
case -1:
System.out.println("Server Quits.");
return;
case '\r':
break;
case '\n':
ds.send(new DatagramPacket(buffer,pos,
InetAddress.getLocalHost(),clientPort));
pos=0;
break;
default:
buffer[pos++] = (byte) c;
}
}
}
public static void TheClient() throws Exception {
while(true) {
DatagramPacket p = new DatagramPacket(buffer, buffer.length);
ds.receive(p);
System.out.println(new String(p.getData(), 0, p.getLength()));
}
}
public static void main(String args[]) throws Exception {
if(args.length == 1) {
ds = new DatagramSocket(serverPort);
TheServer();
} else {
ds = new DatagramSocket(clientPort);
TheClient();
}
}
}
该程序被DatagramSocket 构造函数限制在本地机的两个端口间运行。试着运行该程序,在一个窗口中键入
java WriteServer
这是在客户端的。然后运行
java WriteServer 1
这是在服务器端的。在服务器窗口中打印的任何东西在接受回车之后将被送到客户窗口。
注意:该例题需要你的计算机与Internet相连。

<<上一页 1 2 3 4 5 6 7 8 9 10 下一页>>


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· 第17章 输入/输出:探究java.io (06-19) · java.util第2部分:更多的实用工具类 (06-11)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
  赛迪推荐  
  手机·资费 ·新品·导购·评测·手机资费·宽带
手机搜索  诺基亚 N73 MOTO Z6
  IT产品 ·笔记本·台式机·服务器·打印·投影
IT产品搜索 
  IT技术 ·开发·网管·安全·数据库·操作系统
  信息化 ·热点·专题·访谈·周刊·方案案例
[政务][电信][金融][农业][制造业][中小企业]
[CIO][ERP][协同][IT管理][中间件][电子商务]
[政策][地方][专家][评估][辞典][博客][社区]
· 专题:一路畅通构想曲——让出行不再遭遇堵车
· CIO工作亲历:企业ERP选型不能忽视"选人关"
· 综述:信息化建设给中国监狱带来的各种变化
· 金融业风险管理和法规遵从有五点需考虑的因素
· 保险业CIO关注:该如何建立统一高效的CRM体系
· 调查显示:多数CIO对IT规划仍存在困惑和误解
  博客·论坛 ·曾剑秋·项立刚·Java学习·网管