第1章 网络通信协议
1.1 IP地址和端口号
IP地址就是电脑的地址,而你的电脑里面每个应用程序都有一个端口号,软件住在电脑里相当于人住在楼里。端口号就是软件住在电脑里的门牌号。
1.2 InetAddress
InetAdderss类,该类用于封装一个IP地址,并提供了一系列与IP地址相关的方法
第2章 UDP与TCP协议
UDP速度快,但是不稳定。TCP速度慢,但是很稳定。
2.1 UDP协议,数据的发送端和接收端不建立逻辑连接
UDP在传输数据的时候,发送端发送数据是不会确定有没有接收端就发,而接收端就算是收到数据也不会反馈给发送端自己接受到了数据。
UDP传输数据被限制在64K以内。
2.2 TCP协议是面向连接的通信协议,即在传输数据前先在发送端和接收端建立逻辑连接
TCP协议每次建立和传输都会执行“三次握手”
第一次握手:发送端告诉接收端,我要发送了,你在不在?
第二次握手:接收端收到了第一个消息,回复发送端,我在!你发吧。
第三次握手:发送端看到了接收端的回复,并在此确定发送信息传输。
TCP很符合面向连接的特性,可以确认传输的安全性,因为这个安全性你在下载文件时如果数据接收的不完整就打不开,下载文件时必须采用TCP协议。
第3章 UDP通信 随缘发送随缘接收
原理图:
3.1 DatagramPacket数据解包 接收端
UDP是一个快速但不稳定的网络通讯协议,所以他不需要在接收端和发送端建立连接
UDP在传输和接收的时候都需要建立一个发送站和接收站,来当发送端和接收端的码头,用来打包数据和解压数据。
构造方法
案列展示:
- 创建接收端要接受传输的端口号\接受端一定要和发送端的端口号一样//快递单的地址
- 创建一个数组,用来装传输的数据(接收传来的数组数据)。大小定位到1024//用来放快递的容器
- 调用拆包对象,明确接收拆包的数组名称和数组长度。//调用的方法接收和发送都一个方法,但是在接收里面是拆包,在发送里面是打包DatagramPacket
- 调用receive接收一下包。//把你从发送端收到的数据(ds)用容器装好(dp)
- 开始拆包
获取接收的数据长度Int lenth=接收的数值长度
利用InetAdderss类调用它的方法来获取到ip地址并赋值给ip
String ip=接收端的IP . 以String文本形式返回给你
获取发送端的端口号
打印一下
3.2 DatagramSocket数据打包 发送端
创建一个要发送的讯息
封装IP地址(要发送的IP)前提是要在一个局域网下(如果不知道自己的本机地址,那么127.0.0.1就是默认本机)
- 创建数据 把要发送的数值名称和长度,还有发送的IP地址和端口号打包进dp里
- 创建发送的对象
- 用发送对象发送dp(包装好的讯息)
- 释放资源
3.3 用UDP通信建立一个类似聊天室的功能
接收端和上面的一样没有上面太大的改动
1和2都不需要重复调用,所以卸载while方法外面
因为3是拆包对象,每次来讯息都需要拆包下面的4和5页是一样的,每次的讯息不一样所以得进whil循环里面
发送端
因为发送端每次发送的都不一样,这个时候我们用调用Scanner类让用户输入方式给他定义一下
2和封装IP地址不用每次都调用,所以放在whil循环外面
因为这里是让用户输出的内容发送,所以这里吧数组给放在whil循环里面了,因为你不知道用户每次输入的是什么说以每次都得调用
注:要发送的IP地址必须要在同一个局域网里面,而且接收端和发送端的端口号要填写的一样
第4章 TCP通信
原理图:
4.1 ServerSocket //服务器端
这个就是创建服务器对象,给他明确端口号的。
4.2 Socket//客户端
这个创建客户端对象的方法是直接输入要传输的IP地址和端口号
这个创建客户端的方法是可以调用InetAddressd类的方法来直接获取IP地址的返回值
Socket的常用方法
方法声明 |
功能描述 |
int getPort() |
该方法返回一个int类型对象,该对象是Socket对象与服务器端连接的端口号 |
InetAddress getLocalAddress() |
该方法用于获取Socket对象绑定的本地IP地址,并将IP地址封装成InetAddress类型的对象返回 |
void close() |
该方法用于关闭Socket连接,结束本次通信。在关闭socket之前,应将与socket相关的所有的输入/输出流全部关闭,这是因为一个良好的程序应该在执行完毕时释放所有的资源 |
InputStream getInputStream() |
该方法返回一个InputStream类型的输入流对象,如果该对象是由服务器端的Socket返回,就用于读取客户端发送的数据,反之,用于读取服务器端发送的数据 |
OutputStream getOutputStream() |
该方法返回一个OutputStream类型的输出流对象,如果该对象是由服务器端的Socket返回,就用于向客户端发送数据,反之,用于向服务器端发送数据 |
4.3 用TCP通信上传文件
4.4 文件上传案例 单线程
服务器端:
客户端:
客户端:
4.5 文件上传案例 多线程
创造的多线程在服务器端,因为服务器端要接收多个客户端的上传,所以客户端的代码不用动,只要改服务器端的就可以。
因为是多线程,所以得用到run方法。
Run方法里面不用创建服务器端,因为不用每次都创建,把创建服务器端写进服务器端里就可以。
这是服务端的设置
顺序就是,服务器创建对象开启while循环创建多线程,只要一有人上传进while循环
While循环条件是true所以都能进来,一件来就创建连接,然后new一个客户端的对象接受,进入run方法走一遍