网络编程学习----(2)UDP模式下,实现数据的传输与接受

1 IP地址:Java类中的InetAddress对象
2 TCP和UDP
3 Socket
4 UDP模式下,实现数据的传输与接受
5 结合多线程实现聊天功能

1 IP地址:Java类中的InetAddress对象

对InetAddress的简单操作

public static void UDPPartern_IP(){
        try {
            InetAddress ip = InetAddress.getLocalHost();//得到本地IP地址
            System.out.println(ip.getAddress());
            System.out.println(ip.getHostAddress());//IP地址
            System.out.println(ip.getHostName());//主机名称
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }

2 TCP和UDP

2.1 UDP

1 将数据及源和目的封装成数据包中,不需要建立连接
2 每个数据包的大小限制在64K内
3 因无需连接,是不可靠协议
4 不需要建立连接,速度快

2.1 TCP

1 建立连接,形成传输数据的通道。
2 在连接中进行大数据量传输。
3 通过三次握手完成连接,是可靠协议
4 必须建立连接,效率会稍低

3 Socket

Socket就是为网络服务提供的一种服务机制
通信两端都有Socket。
网络通信其实就是Socket之间的通信
数据在两个Socket间通过IO传输

4 UDP模式下,实现数据的传输与接受

代码如下,发送端发送数据:

 public static void UDPPartern_send(){
        try {
            //1 创建UDP服务.通过DatagramSocket对象
            DatagramSocket ds = new DatagramSocket();
            //2 确定数据,并将其封装为数据包
            byte[] buf = "udp ge men lai le".getBytes();
               //将数据发送到本机地址上1234端口
            DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName(InetAddress.getLocalHost().getHostAddress()),1234);
            //3 发送数据
            ds.send(dp);
            //4 关闭资源
            ds.close();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

接受端接受数据:

public static void UDPPartern_receive(){
        try {
            //1 创建UDP服务.通过DatagramSocket对象
            DatagramSocket ds = new DatagramSocket(1234);
            //2 确定数据,并将其封装为数据包
            byte[] buf = new byte[1024];
            DatagramPacket dp = new DatagramPacket(buf,buf.length);
            //3 发送数据
            ds.receive(dp);
            System.out.println("addressName"+dp.getAddress().getHostAddress());
            String data = new String(dp.getData(),0,dp.getLength());
            System.out.println("data"+data);
            //4 关闭资源
            ds.close();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

5 结合多线程实现聊天功能

在继续扩展,将发送和接收各自作为一个线程,通过开启两个线程,一个负责读取键盘录入数据并发送,另一个负责接受发送数据。
代码如下:
发送端:

public class Socket_send implements Runnable{

    private DatagramSocket ds;


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

    @Override
    public void run() {
        try {
            //2 确定数据,并将其封装为数据包
            BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

            String line = null;

            while((line = bf.readLine())!=null){
                if("886".equals(line)){
                    break;
                }
                byte[] buf = line.getBytes();

                DatagramPacket dp = new DatagramPacket(buf, buf.length,InetAddress.getByName(InetAddress.getLocalHost().getHostAddress()),12002);

                ds.send(dp);
               //注意最后不能关闭。如果一端的Socket被关闭(或主动关闭或者因为异常退出而引起的关闭),另一端仍发送数据,会导致异常
            }
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

接收端:

public class Socket_receive implements Runnable{

    private DatagramSocket ds;

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

    @Override
    public void run() {
        while(true){
            try {
                //2 确定数据,并将其封装为数据包
                byte[] buf = new byte[1024];
                DatagramPacket dp = new DatagramPacket(buf,buf.length);
                //3 发送数据
                ds.receive(dp);
                System.out.println("addressName:  "+dp.getAddress().getHostAddress());
                String data = new String(dp.getData(),0,dp.getLength());
                System.out.println("data:  "+data);
                //注意最后不能关闭。如果一端的Socket被关闭(或主动关闭或者因为异常退出而引起的关闭),另一端仍发送数据,会导致异常
            } catch (SocketException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

上面程序通过监听某个IP地址下的某个端口,实现信息的发送和接收,聊天功能的基础就是基于此的!
另外,要能够将自己所学的知识适时的运用,这很重要!


END

你可能感兴趣的:(网络编程学习----(2)UDP模式下,实现数据的传输与接受)