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

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

作者: 艾剪疏 | 来源:发表于2018-08-28 22:00 被阅读18次

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模式下,实现数据的传输与接受

    1 IP地址:Java类中的InetAddress对象2 TCP和UDP3 Socket4 UDP模式下,实现数据...

  • Java 网络编程

    1.获取主机名,IP地址 2.UDP编程 客户端 3.UDP实现键盘数据的传输,同时使用广播IP地址实现一对多传输...

  • UDP与FTP编程编程及socketserver概述

    一.UDP编程 1. UDP与TCP UDP 是用户数据报协议,是OSI/RM模型中隶属于传输层的面向无连接的网络...

  • socket网络编程-基础知识

    什么是网络编程 网络编程的本质是两个设备之间的数据交换。 Socket、TCP/IP和Udp TCP 传输控制协议...

  • Java基础09网络编程

    Java 基础08GUI 熟练掌握什么是网络编程,网络编程的三要素,Socket原理机制、UDP传输、TCP传输等...

  • java网络编程常见面试题

    java网络编程面试题 1.TC P和 UDP 的区别 tcp:面向连接的传输控制协议,具有高可靠性,确保传输数据...

  • 构建UDP服务

    1. 什么是UDP服务? UDP又称用户数据包协议,与TCP一样同属于网络传输层。UDP与TCP最大的不同是UDP...

  • TCP/UDP传输

    TCP/UDP传输的数据 UDP对应用层传输的数据不做合并拆分,只是简单的加上首部后传输给网络层(不管报文有多长)...

  • Android网络 | Socket(Eclipse--Java

    在现实网络传输应用中,通常使用TCP、IP或UDP这3种协议实现数据传输。在传输数据的过程中,需要通过一个双向的通...

  • TCP 和 UDP的区别

    TCP 和 UDP的区别 TCP:面向连接、传输可靠(保证数据正确性,保证数据顺序)、用于传输大量数据(流模式)、...

网友评论

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

      本文链接:https://www.haomeiwen.com/subject/kvkcwftx.html