【网络编程】调试 3 天的设备终于联网了!UDP 通信踩坑指南,看完少走弯路

 在开始之前,让我们高喊我们的口号:

键盘敲烂,年薪百万!

我听说关注我的人未来都会暴富哦!


目录

键盘敲烂,年薪百万!

我听说关注我的人未来都会暴富哦!

什么是网络编程?

常见的软件架构 :简单来说BS就是浏览器+服务器。而CS就是软件+服务器。

 BS和CS架构的优缺点

 网络编程3要素

IP

小结:

 IPv4小细节

小结: 

InetAddress类的使用

 端口号

协议

UDP协议(发送数据)

 UDP协议(接收数据)

聊天室小练习


什么是网络编程?

常见的软件架构 :简单来说BS就是浏览器+服务器。而CS就是软件+服务器。

 BS和CS架构的优缺点

一般来说像精美的游戏等对画质要求高的用CS,而像商城等对画质要求不高的用BS。因为BS是我服务器现场传送图片和画面到你的显示屏上的。而CS则是一开始就把需要用的图片和画面下载到了本地,服务器只需要告诉你的电脑现在需要显示哪个图片,速度和画面都会很快。


 网络编程3要素

 一个例子:你要在地球上找到你喜欢的人?第一步要知道对方的位置,第二步加上WX(你用微信发消息,对方用微信收消息),第三步开始聊天(用双方都懂的语言)

IP

IPv6就可以让地球上每一粒沙子都 打上ip地址

小结:


 IPv4小细节

这样比如一个网吧,它只需要一个公有的地址,然后再给每个电脑重新分配内部IP,这样以节省地址。

 

 建议自己练习的话就用这个IP地址。这个不会发给你连接的公网IP,而是你发给自己的网卡,网卡发现是这个就自己发送回来了。

小结: 

 ping不仅可以测试在同一个网络下不同ip地址的设备是否和自己连接畅通,也可以ping网址,因为网址底层就是ip地址。


InetAddress类的使用

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

public class MyInetAddressDemo1 {
    public static void main(String[] args) throws UnknownHostException {
/*
        static InetAddress getByName(String host)  确定主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址
        String getHostName()                        获取此IP地址的主机名
        String getHostAddress()                     返回文本显示中的IP地址字符串
*/


      //1.获取InetAddress的对象
        //IP的对象 一台电脑的对象
        InetAddress address = InetAddress.getByName("DESKTOP-5OJJSAM");
        System.out.println(address);

        String name = address.getHostName();
        System.out.println(name);//DESKTOP-5OJJSAM

        String ip = address.getHostAddress();
        System.out.println(ip);//192.168.1.100


    }
}

 端口号

其实可以当电脑上有很多个孔,每个孔都有编号,你的电脑通过65535发送消息出去,你的女生也必须要用同样的65535 的端口号进行接收才能看见你的消息。

协议

协议简单来说就是数据传输的规则。

 

这里主要理解UDP和TCP协议,

UDP协议不检查网络是否通畅,直接发送内容,至于能不能接收到就无所谓,常用于对数据要求不高的功能,比如视频电话等

TCP协议要检查网络是否通畅,常用语不能丢失非常重要的传输,比如安装包、发送邮件等


UDP协议(发送数据)

import java.io.IOException;
import java.net.*;

public class SendMessageDemo {
    public static void main(String[] args) throws IOException {
        //发送数据


        //1.创建DatagramSocket对象(快递公司)
        //细节:
        //绑定端口,以后我们就是通过这个端口往外发送
        //空参:所有可用的端口中随机一个进行使用
        //有参:指定端口号进行绑定
        DatagramSocket ds = new DatagramSocket();

        //2.打包数据
        String str = "你好威啊!!!";
        byte[] bytes = str.getBytes();
        InetAddress address = InetAddress.getByName("127.0.0.1");
        int port = 10086;

        DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);

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


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

 UDP协议(接收数据)

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

public class ReceiveMessageDemo {
    public static void main(String[] args) throws IOException {
        //接收数据



        //1.创建DatagramSocket对象(快递公司)
        //细节:
        //在接收的时候,一定要绑定端口
        //而且绑定的端口一定要跟发送的端口保持一致
        DatagramSocket ds = new DatagramSocket(10086);


        //2.接收数据包
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length);


        //该方法是阻塞的
        //程序执行到这一步的时候,会在这里死等
        //等发送端发送消息
        System.out.println(11111);
        ds.receive(dp);
        System.out.println(2222);


        //3.解析数据包
        byte[] data = dp.getData();
        int len = dp.getLength();
        InetAddress address = dp.getAddress();
        int port = dp.getPort();

        System.out.println("接收到数据" + new String(data,0,len));
        System.out.println("该数据是从" + address + "这台电脑中的" + port + "这个端口发出的");

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


    }
}

 这里的发送和接收的代码可以配合使用。先运行接受数据的代码,然后你会发现只打印了1111,这是因为在等发送的数据过来,然后在运行发送数据的代码,这样再回过头来看接收数据的控制台,就会发现继续执行下去了,打印了你好威啊!!!


聊天室小练习

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

public class SendMessageDemo {
    public static void main(String[] args) throws IOException {
         /*
            按照下面的要求实现程序
                UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束
                UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收
        */


        //1.创建对象DatagramSocket的对象
        DatagramSocket ds = new DatagramSocket();

        //2.打包数据
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请输入您要说的话:");
            String str = sc.nextLine();
            if("886".equals(str)){
                break;
            }
            byte[] bytes = str.getBytes();
            InetAddress address = InetAddress.getByName("255.255.255.255");
            int port = 10086;
            DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
            //3.发送数据
            ds.send(dp);
        }


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


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

public class ReceiveMessageDemo {
    public static void main(String[] args) throws IOException {
        /*
            按照下面的要求实现程序
                UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束
                UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收
        */


        //1.创建对象DatagramSocket的对象
        DatagramSocket ds = new DatagramSocket(10086);

        //2.接收数据包
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length);

        while (true) {
            ds.receive(dp);

            //3.解析数据包
            byte[] data = dp.getData();
            int len = dp.getLength();
            String ip = dp.getAddress().getHostAddress();
            String name = dp.getAddress().getHostName();

            //4.打印数据
            System.out.println("ip为:" + ip + ",主机名为:" + name + "的人,发送了数据:" + new String(data,0,len));
        }


    }
}

可以这样设置,发送端就可以运行多个了。也就是多个发送端,发送到一个接收端显示,这样就像一群人在聊天了

 

 

最终效果

 


今天的分享就到这里,欢迎在评论区交流

一起学习,一起进步!

如果你能关注我

那就是对我创作的最大鼓励啦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是奋斗小杨啊

小额打赏,激励更多精彩分享!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值