网络通信协议、ip、UDP/TCP

第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在传输和接收的时候都需要建立一个发送站和接收站,来当发送端和接收端的码头,用来打包数据和解压数据。

 

构造方法

 

案列展示:

 

  1. 创建接收端要接受传输的端口号\接受端一定要和发送端的端口号一样//快递单的地址
  2. 创建一个数组,用来装传输的数据(接收传来的数组数据)。大小定位到1024//用来放快递的容器
  3. 调用拆包对象,明确接收拆包的数组名称和数组长度。//调用的方法接收和发送都一个方法,但是在接收里面是拆包,在发送里面是打包DatagramPacket
  4. 调用receive接收一下包。//把你从发送端收到的数据(ds)用容器装好(dp)
  5. 开始拆包

获取接收的数据长度Int lenth=接收的数值长度

利用InetAdderss类调用它的方法来获取到ip地址并赋值给ip

String ip=接收端的IP . 以String文本形式返回给你

 

 

获取发送端的端口号

打印一下

3.2      DatagramSocket数据打包 发送端

 

创建一个要发送的讯息

封装IP地址(要发送的IP)前提是要在一个局域网下(如果不知道自己的本机地址,那么127.0.0.1就是默认本机)

  1. 创建数据 把要发送的数值名称和长度,还有发送的IP地址和端口号打包进dp里
  2. 创建发送的对象
  3. 用发送对象发送dp(包装好的讯息)
  4. 释放资源

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方法走一遍

原文地址:https://www.cnblogs.com/pandam/p/11187223.html