百木园-与人分享,
就是让自己快乐。

网络编程(inetAddress类的概述和使用----UDP发送和接受数据)

* 如果一个类没有构造方法:
* A:成员全部是静态的(Math,Arrays,Collections)
* B:单例设计模式(Runtime)
* C:类中有静态方法返回该类的对象(InetAddress)
* class Demo {
* private Demo(){}
*
* public static Demo getXxx() {
* return new Demo();
* }
* }
*
* 看InetAddress的成员方法:
* public static InetAddress getByName(String host):根据主机名或者IP地址的字符串表示得到IP地址对象
*/

package cn.itcast_01;

import java.net.InetAddress;
import java.net.UnknownHostException;

/*
 * 如果一个类没有构造方法:
 * A:成员全部是静态的(Math,Arrays,Collections)
 * B:单例设计模式(Runtime)
 * C:类中有静态方法返回该类的对象(InetAddress)
 *         class Demo {
 *             private Demo(){}
 * 
 *             public static Demo getXxx() {
 *                 return new Demo();
 *             }
 *         }
 * 
 * 看InetAddress的成员方法:
 * public static InetAddress getByName(String host):根据主机名或者IP地址的字符串表示得到IP地址对象
 */
public class InetAddressDemo {
    public static void main(String[] args) throws UnknownHostException {
        // public static InetAddress getByName(String host)
        // InetAddress address = InetAddress.getByName(\"liuyi\");
        // InetAddress address = InetAddress.getByName(\"192.168.12.92\");
        InetAddress address = InetAddress.getByName(\"192.168.12.63\");

        // 获取两个东西:主机名,IP地址
        // public String getHostName()--------获取主机名
        String name = address.getHostName();
        // public String getHostAddress()----返回 IP 地址字符串(以文本表现形式)。
        String ip = address.getHostAddress();
        System.out.println(name + \"---\" + ip);
    }
}

 UDP进行代码测试时---首先运行接受数据---然后运行发送数据

UDP发送数据

/*
* UDP协议发送数据:
* A:创建发送端Socket对象
* B:创建数据,并把数据打包
* C:调用Socket对象的发送方法发送数据包
* D:释放资源
*/

package Day26;

import java.io.IOException;
import java.net.*;
/*
 * UDP协议发送数据:
 * A:创建发送端Socket对象
 * B:创建数据,并把数据打包
 * C:调用Socket对象的发送方法发送数据包
 * D:释放资源
 */

public class SendDemo {
    public static void main(String[] args) throws IOException {
        // 创建发送端Socket对象
        //public class DatagramSocketextends Object此类表示用来发送和接收数据报包的套接字
        // DatagramSocket()
        DatagramSocket tt = new DatagramSocket();

        //创建数据并把数据打包
        //public final class DatagramPacket  extends Object此类表示数据报
        //public DatagramPacket(byte[] buf,int length,InetAddress address,int port)
        //buf - 包数据。
        //length - 包长度。
        //address - 目的地址。
        //port - 目的端口号。
        // 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口

        //包数据---创建数据
        byte [] buf = \"hello你好\".getBytes();//---将字符串类型的数据转换为字节数组
        //获取包长度
        int a= buf.length;
        //目的地地址
        //得到IP地址对象---并同时获取主机名和主机的IP地址
        InetAddress ia = InetAddress.getByName(\"192.168.1.4\");
        //给出发送的目的端口
        int port = 10086;

        //打包数据
        DatagramPacket DP = new DatagramPacket(buf,a,ia,port);

        // 调用Socket对象的发送方法发送数据包
        //public void send(DatagramPacket p)throws IOException从此套接字发送数据报包。
        //DatagramPacket 包含的信息指示:将要发送的数据、其长度、远程主机的 IP 地址和远程主机的端口号。
        tt.send(DP);

        //释放资源
        tt.close();

    }
}

 UDP接受数据

/*
* UDP协议接收数据:
* A:创建接收端Socket对象
* B:创建一个数据包(接收容器)
* C:调用Socket对象的接收方法接收数据
* D:解析数据包,并显示在控制台
* E:释放资源
*/

package Day26;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

//UDP协议接受数据
/*
 * UDP协议接收数据:
 * A:创建接收端Socket对象
 * B:创建一个数据包(接收容器)
 * C:调用Socket对象的接收方法接收数据
 * D:解析数据包,并显示在控制台
 * E:释放资源
 */
public class ReceiveDemo {
    public static void main(String[] args) throws IOException {
        //创建接收端对象---并给出要接受机器的端口
        DatagramSocket DS = new DatagramSocket(10086);

        //创建一个数据包(接受容器)
        //public DatagramPacket(byte[] buf,int length)
        // 构造 DatagramPacket,用来接收长度为 length 的数据包
        //buf - 保存传入数据报的缓冲区。
        //len - 要读取的字节数。
        //指定数据包的大小---用于保存传入的数据报的缓冲区
        byte [] bt = new byte[1024];
        //获取包的字节数长度
        int length = bt.length;
        DatagramPacket DP = new DatagramPacket(bt,length);

        //调用Sockt对象的方法来接受数据
        //public void receive(DatagramPacket p)从此套接字接收数据报包
        //p - 要放置传入数据的 DatagramPacket
        DS.receive(DP);

        //解析数据包并显示在控制台上
        // 获取发送端对方的ip
        // public InetAddress getAddress()
        //某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。
        InetAddress IA = DP.getAddress();
        //public String getHostAddress()返回 IP 地址字符串(以文本表现形式)。
        String ip = IA.getHostAddress();

        // public byte[] getData():获取数据缓冲区
        //用来接收或发送数据的缓冲
        // public int getLength():获取数据的实际长度
        //将要发送或接收到的数据的长度。
        byte[] bt1 = DP.getData();
        int get = DP.getLength();
        //public String(byte[] bytes,int offset,int length)---将字节数组转换为字符串
        //bytes - 要解码为字符的 byte
        //offset - 要解码的第一个 byte 的索引
        //length - 要解码的 byte 数
        String s = new String(bt1,0,get);
        //输出查看某个IP地址的机器传递来的数据包
        System.out.println(ip+\"传送的数据是:\"+s);

        //释放资源
        DS.close();

    }
}

 

/*
* 数据来自于键盘录入
* 键盘录入数据要自己控制录入结束。
*/

// 封装键盘录入数据-----键盘自己控制录入数据---输入规定字符就会结束循环
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;

while ((line = br.readLine()) != null) {

if (\"886\".equals(line)) {
break;
}

UDP发送端

 

package cn.itcast_04;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/*
 * 数据来自于键盘录入
 * 键盘录入数据要自己控制录入结束。
 */
public class SendDemo {
    public static void main(String[] args) throws IOException {
        // 创建发送端的Socket对象
        DatagramSocket ds = new DatagramSocket();

        // 封装键盘录入数据
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = null;
        while ((line = br.readLine()) != null) {
            if (\"886\".equals(line)) {
                break;
            }

            // 创建数据并打包
            byte[] bys = line.getBytes();
            // DatagramPacket dp = new DatagramPacket(bys, bys.length,
            // InetAddress.getByName(\"192.168.12.92\"), 12345);
            DatagramPacket dp = new DatagramPacket(bys, bys.length,
                    InetAddress.getByName(\"192.168.12.255\"), 12345);

            // 发送数据
            ds.send(dp);
        }

        // 释放资源
        ds.close();
    }
}

 

 

 

UDP接收端---接收端应该一直开着等待接收数据,是不需要关闭

package cn.itcast_04;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

/*
 * 多次启动接收端:
 *         java.net.BindException: Address already in use: Cannot bind
 *         端口被占用。
 */
public class ReceiveDemo {
    public static void main(String[] args) throws IOException {
        // 创建接收端的Socket对象
        DatagramSocket ds = new DatagramSocket(12345);

        while (true) {
            // 创建一个包裹
            byte[] bys = new byte[1024];
            DatagramPacket dp = new DatagramPacket(bys, bys.length);

            // 接收数据
            ds.receive(dp);

            // 解析数据
            String ip = dp.getAddress().getHostAddress();
            String s = new String(dp.getData(), 0, dp.getLength());
            System.out.println(\"from \" + ip + \" data is : \" + s);
        }

        // 释放资源
        // 接收端应该一直开着等待接收数据,是不需要关闭
        // ds.close();
    }
}

 

 多线程实现聊天室程序

一:发送端

package cn.itcast_05;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class SendThread implements Runnable {

    private DatagramSocket ds;

    public SendThread(DatagramSocket ds) {
        this.ds = ds;
    }

    @Override
    public void run() {
        try {
            // 封装键盘录入数据
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    System.in));
            String line = null;
            while ((line = br.readLine()) != null) {
                if (\"886\".equals(line)) {
                    break;
                }

                // 创建数据并打包
                byte[] bys = line.getBytes();
                // DatagramPacket dp = new DatagramPacket(bys, bys.length,
                // InetAddress.getByName(\"192.168.12.92\"), 12345);
                DatagramPacket dp = new DatagramPacket(bys, bys.length,
                        InetAddress.getByName(\"192.168.12.255\"), 12306);

                // 发送数据
                ds.send(dp);
            }

            // 释放资源
            ds.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

 

二:接收端

package cn.itcast_05;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class ReceiveThread implements Runnable {
    private DatagramSocket ds;

    public ReceiveThread(DatagramSocket ds) {
        this.ds = ds;
    }

    @Override
    public void run() {
        try {
            while (true) {
                // 创建一个包裹
                byte[] bys = new byte[1024];
                DatagramPacket dp = new DatagramPacket(bys, bys.length);

                // 接收数据
                ds.receive(dp);

                // 解析数据
                String ip = dp.getAddress().getHostAddress();
                String s = new String(dp.getData(), 0, dp.getLength());
                System.out.println(\"from \" + ip + \" data is : \" + s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

 

三:测试类

package cn.itcast_05;

import java.io.IOException;
import java.net.DatagramSocket;

/*
 * 通过多线程改进刚才的聊天程序,这样我就可以实现在一个窗口发送和接收数据了
 */
public class ChatRoom {
    public static void main(String[] args) throws IOException {
        //创建Socket对象---发送和接收对象
        DatagramSocket dsSend = new DatagramSocket();
        DatagramSocket dsReceive = new DatagramSocket(12306);
  
        //创建对象---并使用构造参数传递其要发送和接收的对象
        SendThread st = new SendThread(dsSend);
        ReceiveThread rt = new ReceiveThread(dsReceive);

        //创建线程对象并给出运行的对象
        Thread t1 = new Thread(st);
        Thread t2 = new Thread(rt);

        //启动线程
        t1.start();
        t2.start();
    }
}

 

 

 

 


来源:https://www.cnblogs.com/ztg-java-xuexi/p/16123811.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » 网络编程(inetAddress类的概述和使用----UDP发送和接受数据)

相关推荐

  • 暂无文章