Socket网络编程

本文以通俗易懂的方式介绍了Java网络编程的基础概念,包括使用DatagramSocket和DatagramPacket进行UDP通信,以及通过Socket和ServerSocket实现TCP连接。通过具体代码示例,展示了如何发送和接收数据包。

开篇废话

身为一个优(cai)秀(niao)的自学java的存在,网络编程怎么能不懂呢?所以咱今天就谈谈这个网络编程,也不知道谈的对不对,总要先谈一谈嘛。我看了众多的教程,都是专业名词、专业解释先给你一通砸下来,先砸蒙了你,让你不禁发出灵魂三问:我是谁?我在哪?我在干什么?他说的啥?这句话每个字都认识,但是合起来为什么就不认识了呢?于是乎,今天,我就打破常规,用最通俗的语言来谈一谈网络编程。

学习前提

什么ip地址啊,域名啊,端口号啊,协议啊,这些的就不用解释了吧,毕竟连我这么优(cai)秀(niao)的自学者都知道,真不知道可以查一查,很简单的。还有Java编程总会吧,类和对象总知道吧。在Java里不就是给了你一个类,然后这个类有几个方法,都是干什么的,怎么用,不就这些吗?我们要学会俯视它。

正文开始之前的废话

我们就先从最简单的开始吧,什么是网络通信,没错就是一台机器给另一台机器通过网络发送数据的,这总能理解吧。能发送数据了,不就能建立通信了,大家不就能联系了?闲话都说了这么多了,那我就再说一些,大家搜索socket的时候,发现都说它是套接字,很神奇吧,这三个字都认识,连在一起就有点不认识了。明明它的翻译是插座,为什么要翻译成套接字呢?假如我们把它翻译成插座,服务器就是一个大插座,客户端就是插头,一方被插,一方去插,然后建立通信,这样不是很好理解吗?至于为什么翻译成套接字,据知乎一位自称刻(wu)苦(liao)钻(tou)研(ding)的IT狗说,这......不......可.....考........。不过呢,我相信,它被翻译成套接字,肯定有它的道理,很有可能,它不止是通信插座这么简单。

真的正文开始了

没办法,我还是想再聊一聊,毕竟学习这么枯燥,我再把文章写得枯燥,那生活就太难了。

我们为什么要用socket进行网络编程呢,回答这个问题之前呢,不得不先回忆一下曾经上课也没听过的计算机网络的知识,什么OSI七层协议啊,TCP五层协议啊,不知道的可以查一查。根据我曾经的零散记忆,我们写的应用程序属于应用层,而TCP/UDP属于运输层,那我们怎么用运输层的协议呢?没错,就是用socket,它介于传输层与应用层之间,使我们不用知道运输层协议细节,直接调用就完事了。

真真正正的正文开始了

不说废话了,我们直接开始Java里的网络编程 ,我们先介绍一个类DatagramSocket,它就是用于既能发送又能接收数据包的类,当然要想发送数据,这个数据也不是你随随便便写个字符串就能发送过去的,还得用另一个类DatagramPacket,我们需要把发送的数据封装成这个DatagramPacket才能通过DatagramSocket发送到指定目的地。

二话不说先上代码:

public class StudySocket {
    public static void main(String[] args) throws IOException {

        //定义要发送的数据
        String content = "只要我E的够快,队友的问号就追不上我 --快乐的亚索";
        //创建DatagramSocket对象,指定8081端口,默认本机地址,模拟发送端
        DatagramSocket datagramSocket = new DatagramSocket(8081);
        //将发送的数据转成字节数组
        byte[] data = content.getBytes();
        //使用DatagramPacket,将字节数组打包发送到指定地址
        DatagramPacket packet = new DatagramPacket(data,data.length,
                new InetSocketAddress("localhost",8080));
        //发送数据包
        datagramSocket.send(packet);
        //关闭socket
        datagramSocket.close();
    }
}

代码解释:

第一步:定义我们要发送的数据,然后使用DatagramSocket创建一个对象并绑定端口号,模拟发送端。

第二步:将发送的数据转成字节数组并将其封装成DatagramPacket,这个类的构造器有很多,我选择的这个有三个参数,第一个是字节数组,就是你要发送的数据,第二个参数就是该字节的长度,第三个参数就是你要发送的地址,没错就是本机的8080端口,我要发送到这里。InetSocketAddress这个类也不用多说吧,不知道的查一查嘛。

第三步:执行发送命令。

第四步:关闭socket。

如此你就可以运行一下试试,运行之后会发生什么呢?当然是什么也没有发生,我也就不截图了,那我们发送过去了吗?发送过去了。那么数据呢?丢了!没错,本机的8080端口又没有打开,没有地方接收,它当然就丢了。诶?,看到这里你是不是就想到了什么,UDP协议,没错,是他,是他,就是他,这个就是使用UDP协议的socket,发送前不需要连接,只管发送,不管你到底接没接收,反正我就是发了。

接下来,就写一个接收端,用来接收发送过来的数据,直接看代码吧

public class SocketServer {
    public static void main(String[] args) throws IOException {
        //创建DatagramSocket对象,绑定8080端口,默认本机地址,模拟接收端
        DatagramSocket datagramSocket = new DatagramSocket(8080);
        //创建字节数组用来接收数据包里的数据,
        byte[] data = new byte[1024*60];
        //创建DatagramPacket,用来接收数据包
        DatagramPacket packet = new DatagramPacket(data,data.length);
        //接收数据包
        datagramSocket.receive(packet);
        //获取数据包里的数据
        data = packet.getData();
        //将字节数组转为String并输出
        System.out.println(new String(data));
        //关闭socket
        datagramSocket.close();
    }
}

先启动接收端,然后接收端就会阻塞,一直等那个数据包发送过来,再启动发送端,我们就会看到,接收端真的接收到了数据

有图有真相。

说起来这个UDP,不得不说起这个TCP,我们看到了,这个UDP不用连接,数据说发送就发送,都不带商量的。但是TCP就不一样了,TCP是先建立连接,然后再发送。话不多说,咱直接用代码来看效果

public class TcpSocket {
    public static void main(String[] args) throws IOException {
        //模拟客户端与本机的8080端口建立连接
        Socket socket = new Socket("localhost",8080);
        //关闭连接
        socket.close();
    }
}

这个代码就简单了很多,直接实例化一个socket就能建立连接,当然,数据就先不发送了,我们先运行一下,看看能不能连接上,运行之前我们先猜想一下,我要跟8080端口建立连接,但是目前我并没有绑定8080端口的服务,也就是说肯定是连接不上的,那么连接不上会发生什么呢?看图说话

看到了吧,直接报错,连接不上。这下有没有体会到TCP和UDP的区别?

这是发送端,我们再建立一个服务端,用来接收服务,这个接收端就需要一个类ServerSocket,我们直接看到代码吧

public class TcpServer {
    public static void main(String[] args) throws IOException {
        //建立接收端,监听8080端口
        ServerSocket serverSocket = new ServerSocket(8080);
        //开始接收,到这里就会阻塞,等待发送端建立连接
        serverSocket.accept();
        System.out.println("连接成功");
        //关闭连接
        serverSocket.close();
    }
}

接收端也很简单,调用accept()方法,等待连接。这样先启动接收端,再启动发送端,就能建立连接了。

结束语

当然,网络编程不是只有这么一点点,这只是简简单单的入个门,理解理解,接下来还有大量的、深入的知识需要学习,路漫漫其修远兮,且行且珍惜。

【轴承故障诊断】加权多尺度字典学习模型(WMSDL)及其在轴承故障诊断上的应用(Matlab代码实现)内容概要:本文介绍了加权多尺度字典学习模型(WMSDL)在轴承故障诊断中的应用,并提供了基于Matlab的代码实现。该模型结合多尺度分析与字典学习技术,能够有效提取轴承振动信号中的故障特征,提升故障识别精度。文档重点阐述了WMSDL模型的理论基础、算法流程及其在实际故障诊断中的实施步骤,展示了其相较于传统方法在特征表达能力和诊断准确性方面的优势。同时,文中还提及该资源属于一个涵盖多个科研方向的技术合集,包括智能优化算法、机器学习、信号处理、电力系统等多个领域的Matlab仿真案例。; 适合人群:具备一定信号处理和机器学习基础,从事机械故障诊断、工业自动化、智能制造等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①学习并掌握加权多尺度字典学习模型的基本原理与实现方法;②将其应用于旋转机械的轴承故障特征提取与智能诊断;③结合实际工程数据复现算法,提升故障诊断系统的准确性和鲁棒性。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注字典学习的训练过程与多尺度分解的实现细节,同时可参考文中提到的其他相关技术(如VMD、CNN、BILSTM等)进行对比实验与算法优化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值