--------------------------------------网络编程(UDP)

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();
        
        
    }



        
        
    }
原文地址:https://www.cnblogs.com/laosunlaiye/p/6915626.html