网络编程原理
在这里我们来介绍两种客户端服务器,一种是TCP/IP,另一种是UDP
UDP:无连接 不可靠传输 面向数据报 全双工
TCP:有连接 可靠传输 面向字符流 全双工
首先我们来介绍什么是有无连接.
像我们常用的QQ和微信,这就是典型的无连接,不管对方是否在线,发送消息就行.
像微信电话或者QQ电话,打给对方,你要等对方接通了之后,才能发送消息.这样的是有连接.
那么什么又是可靠传输和不可靠传输呢?
不能保证传输的数据100%到达.
可靠传输:发送方知道自己的消息是否发送出去了还是丢了.就像ICMP协议中的Ping命令(测试网络互通性),网络不同就丢包,互通的话目的地就回包.
不可靠传输:发送方不知道自己的消息是否发送出去了还是丢了.
面向数据报:就是数据在传输的过程中,是以数据报为基本单位传输.面向字符流:像文件操作一样,
"流式".
全双工:信道能同时进行发送和接收.
介绍完理论知识之后,让我们进入代码环节.
网络编程之UDP
在实现基于UDP客户端服务器之前,首先介绍一下在代码中需要用到的类和方法.
DatagramSocket
创建DatagramSocket这个对象就是创建了一个socket对象.
文件对应的硬件设备是硬盘,而socket文件对应的硬件设备是网卡.既然都是文件,那么它们都是文件描述符表上的一项.
我们程序猿就是基于网卡进行编辑的.
DatagramSocket() 和 DatagramSocket(int port)
DatagramSocket():无参构造方法,没指定哪个端口,系统会自动分配一个端口.
DatagramSocket(int port):有参构造方法,指定了端口.
receive(DatagramPacket p)和send(DatagramPacket p)
顾名思义,一个方法是接收一个方法是发送,但是里面的参数需要注意一下,"输出型参数"在参数中进行内容填充.
close()
既然是文件,那么就要释放资源,不然文件描述符表有可能被占满.
DatagramPacket
DatagramSocket这个对象是描述网卡的,而DatagramPacket这个对象是描述数据的.
DatagramPacket(byte[]buf, int length) : buf 为字节数组,length为数组的长度.
DatagramPacket(byte[] buf, int offset, int length,SocketAddress address) 第二个参数:从零开始到指定长度(length) address : 代表IP地址和端口号.
UDP版本的回显服务器
什么又是回显服务器?正常来说客户端和服务器是这样通信的,放松请求 -> 根据请求计算响应 -> 返回响应 而回显服务器省略了根据请求计算响应,直接将接收到的请求返回成响应.
所以回显服务器又被称为最简单的服务器.
![](https://i-blog.csdnimg.cn/blog_migrate/b4bd2166c8c6e1445694ff6771de2657.png)
服务器要指明端口号是多少,客户端不用指明,为啥客户端不用指明?
我们程序员是对客户端进行编写,知道哪个端口是空闲的.而客户端就不知道了,毕竟是用户的电脑.
![](https://i-blog.csdnimg.cn/blog_migrate/410a1e88a9eb5e7931b567aa78fff9b7.png)
根据上述的receive()方法的讲解,方法中的参数类型是DatagramPacket 所以我们要创建一个空的DatagramPacket实例,给它初始化,然后交给receive()方法将接受到的请求写入到字节数组中.
![](https://i-blog.csdnimg.cn/blog_migrate/a86f8fe34e0de558a875be208e0db830.png)