Java网络编程(四)

2014-11-24 02:22:21 · 作者: · 浏览: 3
mPacket代表DatagramSocket发送和接收的数据报。

3.1 使用DatagramSocket发送、接收数据
DatagramSocket本身并不负责维护状态和产生IO流。它仅仅负责接收和发送数据报。使用receive(DatagramPacket p)方法接收,使用send(DatagramPacket p)方法发送。
这里需要首先明确的是,DatagramPacket对象的构造。DatagramPacket的内部实际上采用了一个字节型数组来保存数据,它的初始化方法如下:

Java代码
//接收端的DatagaramSocket内部包含一个空的数组,接收传递过来的数据报中的数组信息。可以通过DatagaramSocket对象的getData()方法返回的数组来获取其中的包含的数组。
Private DatagaramSocket udpSocket=new DatagaramSocket(buf,buf.length);
//发送端的DatagaramSocket内部包含一个将要传递的数组,同时需要包含目标IP和端口。如果初始化时传递的数组参数是空,可以通过调用DatagaramSocket对象的setData()方法设置内容。
Private DatagaramSocket udpSocket=new DatagaramSocket(buf,buf.length,IP,PORT);
udpSocket。setData(outBuf);
作为这两个方法的参数,作用和构造不同的。作为接收方法中的参数,DatagramPacket中的数组一个空的数组,用来存放接收到的DatagramPacket对象中的数组;而作为发送方法参数,DatagramPacket本身含有了目的端的IP和端口,以及存储了要发送内容的指定了长度的字节型数组。
另外,DatagramPacket对象还提供了setData(Byte[] b)和Byte[] b= getData()方法,用于设置DatagramPacket中包含的数组内容和获得其中包含数组的内容。
使用TCP和UDP通讯的编码区别:
a. 在TCP中,目标IP和端口由Socket指定包含;UDP中,目标IP由DatagramPacket包含指定,DatagramSocket只负责发送和接受。
b. 在TCP中,通讯是通过Socket获得的IO流来实现;在UDP中,则通过DatagramSocket的send和receive方法

3.2 使用MulticastSocket实现多点广播
MulticastSocket是DatagramSocket的子类,可以将数据报以广播形式发送到数量不等的多个客户端。实现策略就是定义一个广播地址,使得每个MulticastSocket都加入到这个地址中。从而每次使用MulticastSocket发送数据报(包含的广播地址)时,所有加入了这个广播地址的MulticastSocket对象都可以收到信息。
MulticastSocket的初始化需要传递端口号作为参数,特别对于需要接受信息的端来说,它的端口号需要与发送端数据报中包含的端口号一致。具体代码如下://创建用于发送、接收数据的MulticastSocket对象
Java代码
//因为该MulticastSocket对象需要接收,所以有指定端口
socket = new MulticastSocket(BROADCAST_PORT);
broadcastAddress = InetAddress.getByName(BROADCAST_IP);
//将该socket加入指定的多点广播地址
socket.joinGroup(broadcastAddress);
//设置本MulticastSocket发送的数据报被回送到自身
socket.setLoopbackMode(false);
//初始化发送用的DatagramSocket,它包含一个长度为0的字节数组
outPacket = new DatagramPacket(new byte[0] , 0 ,
broadcastAddress , BROADCAST_PORT);
使用代理服务器
Java中可以使用Proxy直接创建连接代理服务器,具体使用方法如下

Java代码
public class ProxyTest
{
Proxy proxy;
URL url;

URLConnection conn;
//从网络通过代理读数据
Scanner scan;
PrintStream ps ;
//下面是代理服务器的地址和端口,
//换成实际有效的代理服务器的地址和端口
String proxyAddress = "202.128.23.32";
int proxyPort;
//下面是你试图打开的网站地址
String urlStr = "http://www.oneedu.cn";

public void init()
{
try
{
url = new URL(urlStr);
//创建一个代理服务器对象
proxy = new Proxy(Proxy.Type.HTTP,
new InetSocketAddress(proxyAddress , proxyPort));
//使用指定的代理服务器打开连接
conn = url.openConnection(proxy);
//设置超时时长。
conn.setConnectTimeout(5000);
scan = new Scanner(conn.getInputStream());
//初始化输出流
ps = new PrintStream("Index.htm");
while (scan.hasNextLine())
{
String line = scan.nextLine();
//在控制台输出网页资源内容
System.out.println(line);
//将网页资源内容输出到指定输出流
ps.println(line);
}
}
catch(MalformedURLException ex)
{
System.out.println(urlStr + "不是有效的网站地址!");