Java学习里程-----Java基础_27 Socket(下)

接着上一讲我们继续来说。上一讲我们说了使用TCP协议去实现Socket套接,这次我们来看UDP协议下的Socket是如何使用

UDP

我们的需求是这样的:还是A向B发送一个信息,信息内容:我饿了,很饿很饿(我确实很饿,现在还在办公室加班。。)

我们先来写A(客户端),先创建一个类,类名叫 StudySocket02,顺便把main方法也写上。

Java学习里程-----Java基础_27 Socket(下)

之后呢,我们同样,也得去定义一下我们要发送给谁,我们来创建一下ip和port

Java学习里程-----Java基础_27 Socket(下)

当然,我们还得有我们要发送的内容,再来创建一个String

Java学习里程-----Java基础_27 Socket(下)

好,接下来,我们就开始着手写Socket了

这里和我们之前的TCP就不一样了,我们需要实例化一个类,叫DatagramPacket,这个里面呢,封装要发送的包数据和服务器地址和端口号。好,来实践一下

Java学习里程-----Java基础_27 Socket(下)

可以看到啊,选择题又来了,这里我直接告诉你,选择我框住的这个。我来给大家讲一下这些个参数的含义

第一个参数,就是你要发送的内容,不过是byte[] 格式的

第二个参数,就是你要发送的这个内容的长度,我们直接用这个数组点length() 就可以获取到

第三个参数,是一个对象,这个对象里面存放着我们要发送的地址。

第四个参数,是这个地址下,我们要使用的端口号。

知道了参数之后,我们开始构建。

Java学习里程-----Java基础_27 Socket(下)

这里的InetAddress是固定套路,直接用这个InetAddress.getByName(ip) 获取即可,不相信的话,我来上源码

Java学习里程-----Java基础_27 Socket(下)

这个红框框中的英文是这个意思地:

Java学习里程-----Java基础_27 Socket(下)

就是放个ip地址就好了

有了这些之后,不要以为就可以了,实际上Socket我们还没有创建呢,接着我们来创建一下,这里咱也不去直接用Socket了,我们用另外一个,DatagramSocket

Java学习里程-----Java基础_27 Socket(下)

直接实例化。实例化完成,调用send方法,发送数据。

Java学习里程-----Java基础_27 Socket(下)

是不是,有木有,很简单,比我们之前的内个还得使用流强多了。但是!别忘记关闭!!!

Java学习里程-----Java基础_27 Socket(下)

还得修改一下,把这个定义的放在try的外面,放里面的话,这个finally中就拿不到了。

这样我们A这个客户端就写完了,接下来就是B(服务端)了。

同样的操作,创建一个StudySocket02Server类,写上main方法(图我就不截了)

我们A端用的是DatagramPacket发送的数据,同样,我们得在B端,用这个去接收。

先实例化一下DatagramPacket

Java学习里程-----Java基础_27 Socket(下)

我直接告诉大家,用这个。后面内俩参数是这样的,byte[]参数是我们得创建的,因为要用这个去接收A端发来的内容。后面的length就是这个内容的大小。

Java学习里程-----Java基础_27 Socket(下)

这样就好了。接着我们还得弄个Socket,暴露出端口,这个是为了给A能够找到。同样,还得用DatagramSocket

Java学习里程-----Java基础_27 Socket(下)

A发送的时候不是调用的send吗,B这里接收调用receive,参数就是上面定义的datagramPacket

Java学习里程-----Java基础_27 Socket(下)

我不知道大家有没有看到,它这个receive方法的返回值是void,空的啊。这个就头大了,空的怎么到时候输出内容?

实际上是这样的,它这个receive把要输出的内容放在了datagramPacket里面,我们调用datagramPacket就可以获取到A发的信息了。

Java学习里程-----Java基础_27 Socket(下)

好,写到这里,方法就差不多写完了,来测试一下

测试1:不启动B,直接启动A

Java学习里程-----Java基础_27 Socket(下)

我们可以看到啊,不出错,当然呢,也啥也没有,为了能看出来它执行了,我们加两段代码

Java学习里程-----Java基础_27 Socket(下)

再来执行。

Java学习里程-----Java基础_27 Socket(下)

测试2:先启动B,再启动A。

Java学习里程-----Java基础_27 Socket(下)

可以看到啊,B已经启动了,接着启动A

Java学习里程-----Java基础_27 Socket(下)

可以看到,A已经发送内容了。再来看一下B有没有收到

Java学习里程-----Java基础_27 Socket(下)

是不是,也收到了。

 

这里给大家说一下,B 启动以后,线程会阻塞在datagramSocket.receive(datagramPacket);这个地方,它呢一直等有人给他发信息,没有人发,它就一直等,直到我们启动了A,发了消息,这个线程才会继续执行。

 

到这里,我们这个Socket基础就讲述完了,大家要好好理解,以后我们会用到这个东西。

有不懂的地方可以直接私聊我,或者加我QQ:2100363119

Java学习里程-----Java基础_27 Socket(下)

ps:上方二维码是我个人的公众号,最近刚开不久,我每个月都会更新一些活动,希望大家可以积极参加,4月份活动已开,活动详情可以关注公众号之后,回复“活动”二字进行查看,参加。