//接收端
import java.net.DatagramSocket;import java.net.DatagramPacket;
public class UDPServerA
{
public static void main(String[] args) throws Exception{ //这里抛出异常
DatagramSocket ds=new DatagramSocket(8888);//创建本地端口套接字,8888为本地端口。这步会有异常产生
byte[] buff=new byte[1024];//接收信息数组
DatagramPacket dp=new DatagramPacket(buff,1024);//数据报包接收数据到数组
ds.receive(dp);//套接字开始接收数据包。这步会有异常产生
//String str=new String(buff,0,buff.length);//这里也可以打印出接收数据,但会多出很多空行,因为打印了数组1024B的字节
//System.out.print(str);//而一般我们测试的接收数据达不到填充整个数组buff,所以会多出空行
String str1=new String(dp.getData(),0,dp.getLength());//dp.getData()得到数组,dp类的getLength()方法得到长度,
//数组.length属性得到长度、String.length()方法得到长度。
System.out.println(str1);ds.close();
}
}
//发送端
import java.net.DatagramSocket;
import java.net.DatagramPacket;
import java.net.InetAddress;
public class UDPClientA
{
public static void main(String[] args) throws Exception{
//创建本地套接字
DatagramSocket ds=new DatagramSocket(9999);//9999为本地端口,这步会产生异常
//发送的数据
String str="abc";
//创建用于发送数据的数据报包
DatagramPacket dp=new DatagramPacket(str.getBytes(),0,str.length(),InetAddress.getByName("localhost"),8888);//8888为
//发送的目的端口。这步会产生异常
ds.send(dp);//这步会产生异常
ds.close();
}
}
上述注释简单说了端口号、打印接收数据等问题
这里简单说下异常:
用throws Exception抛出,因为是基类,而且Exception在java.lang包下,所以不用import具体的类;
DatagramSocket ds=new DatagramSocket(8888);中构造方法
抛出:SocketException
- 如果套接字不能被打开,或不能将其绑定到指定的本地端口。
SecurityException
- 如果安全管理器存在并且其
checkListen
方法不允许进行该操作。
ds.receive(dp);中DatagramSocket的receive()方法
IOException
- 如果发生 I/O 错误。
SocketTimeoutException
- 如果先前调用了 setSoTimeout 且超时值已过。
PortUnreachableException
- 套接字连接到当前不可达的目标时可能抛出。注意,不能保证一定抛出该异常。
IllegalBlockingModeException
- 如果此套接字具有相关联的通道,且通道处于非阻塞模式。
InetAddress.getByName("localhost")中getByName()方法
UnknownHostException
- 如果找不到
host
的 IP 地址,或者 scope_id 是为全局 IPv6 地址指定的。
SecurityException
- 如果安全管理器存在并且其 checkConnect 方法不允许进行该操作
ds.send(dp);中DatagramSocket.send(dp)
IOException
- 如果发生 I/O 错误。
SecurityException
- 如果安全管理器存在并且其
checkMulticast
或
checkConnect
方法不允许进行发送。
PortUnreachableException
- 套接字连接到当前不可达的目标时可能抛出。注意,不能保证一定抛出该异常。
IllegalBlockingModeException
- 如果此套接字具有相关联的通道,且通道处于非阻塞模式。