开篇废话
身为一个优(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()方法,等待连接。这样先启动接收端,再启动发送端,就能建立连接了。
结束语
当然,网络编程不是只有这么一点点,这只是简简单单的入个门,理解理解,接下来还有大量的、深入的知识需要学习,路漫漫其修远兮,且行且珍惜。

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

被折叠的 条评论
为什么被折叠?



