InetAddress类
java.net包中的InetAddress类用于封装IP地址和DNS。要创建InetAddress类的实例。可以使用工厂方法,因为此类没有可用的的构造方法。
InetAddress类中的工厂方法
static InetAddress getLocalHost();//返回表示本机InetAddress对象
static InetAddress getByName(String hostName);//为主机名为hostName的主机返回InetAddress对象
static InetAddress[] getAllByName(String hostName);为主机名为hostName的所有可能主机返回InetAddress对象组
如果不能找到主机,两种方法都能抛出UnknownHostNameException异常。
输出本地主机的地址信息
class InetAddressTest(){
public static void main(String args[]){
try{
IneAddress add=IneAddress.getLocalHost();
System.out.println("本机的主机地址是:"+add);
}
catch(UnkonwnHostNameException){
//此处省略代码}
}
}
基于UDP协议的Socket编程
基于TCP协议的网络通信是安全、双向的,UDP协议的网络通信就不一样了,只需要指明对方写地址,然后将数据传送出去,并不事先连接。
这样的网络通信数据是不安全的,应用场合如聊天系统,咨询系统等。
学习UDP之前先要了解一个术语“数据报”,数据报是表示通信的一种报文类型,使用数据报进行通信时,无需事先建立连接这个过程,他是基于UDP协议
进行的。
Java中有两个可使用数据报实现通信的类,即DatagramPacket和DatagramSocket.DatagramPacket类起到数据容器的作用,DatagramSocket用于发送和接收DatagramPacket.
Datagram类不提供发送或接收数据的方法,而DatagramSocket类则提供send()方法和receive()方法,用于通过套接字发送和接收数据报。
1.DatagramPacket类
1)构造方法
DatagramPacket类封装了数据报的数据、数据长度、目标地址和目标端口。客户端要向外发送数据,必须首先创建一个DatagramPacket对象,在使用DatagramSocket发送。
DatagramPacket类常用的构造方法如下:
DatagramPacket(byte[] date,int size)//构造DatagramPacket对象,封装长度为size的数据报
DatagramPacket(byte[] buf,int length,InetAddress address ,int port)//构造DatagramPacket对象,封装长度为length的数据报及发总指定的主机、端口号。
2)常用法法
byte[] getDate();//返回一个字节数组,该数组包含接收到或要发送的数据报中的数据
int getLength()//返回发送或接收的数据长度
InetAddress getAddress();//返回一个发送或接收此数据的主机IP地址
int getPort();//返回发送或接收此数据的主机端口号
2.DatagramSocket类
1)构造方法
DatagramSocket类不维护连接状态,不产生输入/输出数据流,他的唯一作用就是结束和发送DatagramPacket对象封装好的数据报。常用的DatagramSocket类的构造方法:
DatagramSocket()//创建一个DatagramSocket对象,并将其与本地主机上任何可用端口绑定
DatagramSocket(int port)//创建一个DatagramSocket对象,并将其与本地指定的端口绑定
2)常用的方法
void connect(InetAdress address ,int port)//将当前DatagramSocket对象连接到远程地址的指定端口
void close();//关闭当前DatagramSocket对象
void disconnect()//断开当前DatagramSocket对象的连接
int getLocalPort()//返回当前DatagramSocket对象绑定的本地主机端口号
void send(DatagramPacket p)//发送指定的数据报
void receive(DatagramPacket p)//接收数据报。收到数据以后,存放在指定的DatagramPacket对象中
3)基于UDP协议的Socket网络编程一般按照以下4个步骤进行:
(1)利用DatagramPacket对象进行封装数据报。
(2)利用DatagramSocket对象发送数据报。
(3)利用DatagramSocket对象接收数据报。
(4)利用DatagramPacket对象处理数据报。
4)模拟客户咨询功能,实现发送咨询问题,接收方接收并显示发送过来的咨询问题,发送方发送咨询问题,接收方回应咨询
/** * 服务器端 * @param args * @throws IOException */ public static void main(String[] args) throws IOException { //创建DatagramPacket对象,用来准备接收数据报 byte[]buf=new byte[1024]; DatagramPacket dp =new DatagramPacket(buf, 1024); //创建DatagramSocket对象用来接收数据 DatagramSocket ds=new DatagramSocket(8800); ds.receive(dp); //显示接收到的信息 String str =new String(dp.getData(), 0, dp.getLength()); System.out.println(dp.getAddress().getHostAddress()+"说:"+str); //向客户端发送响应信息 String reply ="你好,我在,请咨询"; //显示本地对话框 System.out.println("我说:"+reply); //创建DatagramPacket对象 SocketAddress sa = dp.getSocketAddress(); DatagramPacket dpto=new DatagramPacket(reply.getBytes(), reply.getBytes().length, sa); ds.send(dpto);
/** * 客户端 * @param args * @throws IOException */ public static void main(String[] args) throws IOException { String mess="你好,我想咨询一个问题。"; //获取主机本地地址 InetAddress ia = InetAddress.getByName("localhost"); //创建DatagramPacket对象,封装数据 DatagramPacket dp=new DatagramPacket(mess.getBytes(), mess.getBytes().length, ia, 8800); //创建DatagramSocket对象向服务器发送数据 DatagramSocket ds=new DatagramSocket(); ds.send(dp); //接收服务端的响应 byte[]buf=new byte[1024]; DatagramPacket dpre =new DatagramPacket(buf, buf.length); ds.receive(dpre); //显示接收到的信息 String string =new String(dpre.getData(), 0, dpre.getLength() ); System.out.println(dpre.getAddress().getHostAddress()+"说:"+string); //关闭DatagramSocket对象 ds.close(); }
}