zoukankan      html  css  js  c++  java
  • --------------------------------------网络编程(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();
            
            
        }
    
    
    
    
            
            
        }
  • 相关阅读:
    牛客 小a与星际探索 bfs
    gear gym 思维题
    dp Surf
    P1280 尼克的任务
    Codeforces Round #539 (Div. 2) C. Sasha and a Bit of Relax
    Codeforces Round #542 C. Connect 搜索
    Layui 文件上传 附带data数据
    Layui 隐藏左侧菜单
    Layui 关闭当前标签页
    Layui Iframe页面间 方法的相互调用
  • 原文地址:https://www.cnblogs.com/laosunlaiye/p/6915626.html
Copyright © 2011-2022 走看看