TCP:
transfer control
protocol
一种面向连接(连接导向)的、可靠的、
基于字节流的运输层(Transportlayer)
通信协议 。
特点
•
面向连接
•
点到点的通信
•
高可靠性
•
占用系统资源多、效率低
其中这里就会涉及到三次握手:
1.客户端发送了一个带有SYN的Tcp报文到服务器,这个三次握手中的开始。表示客户端想要和服务端建立连接。
2.服务端接收到客户端的请求,返回客户端报文,这个报文带有SYN和ACK标志,询问客户端是否准备好。
3.客户端再次响应服务端一个ACK,表示我已经准备好,连接建立成功。
在java中的使用:
-
使用基于TCP协议的Socket网络编程实现
-
TCP协议基于请求-响应模式
-
在网络通讯中,第一次主动发起通讯的程序被称作客户端(Client)程序
-
第一次通讯中等待连接的程序被称作服务器端(Server)程序
-
利用IO流实现数据的传输
示例代码:文件上传
服务端:
/**
* 存储文件
* 创建服务器
* 1、指定端口 使用ServerSocket创建服务器
* 2、阻塞式等待连接 accept
* 3、操作: 输入输出流操作
* 4、释放资源
*/
public class FileServer {
public static void main(String[] args) throws IOException {
System.out.println("-----Server-----");
// 1、指定端口 使用ServerSocket创建服务器
ServerSocket server =new ServerSocket(8888);
// 2、阻塞式等待连接 accept
Socket client =server.accept();
System.out.println("一个客户端建立了连接");
// 3、操作: 文件拷贝 存储
InputStream is =new BufferedInputStream(client.getInputStream());
OutputStream os =new BufferedOutputStream(new FileOutputStream("baidu123.html"));
byte[] flush =new byte[1024];
int len = -1;
while((len=is.read(flush))!=-1) {
os.write(flush,0,len);
}
os.flush();
//3、释放资源
os.close();
is.close();
// 4、释放资源
client.close();
server.close();
}
}
客户端:
/**
* 上传文件
* 创建客户端
* 1、建立连接: 使用Socket创建客户端 +服务的地址和端口
* 2、操作: 输入输出流操作
* 3、释放资源
*/
public class FileClient {
public static void main(String[] args) throws UnknownHostException, IOException {
System.out.println("-----Client-----");
//1、建立连接: 使用Socket创建客户端 +服务的地址和端口
Socket client =new Socket("localhost",8888);
//2、操作: 拷贝 上传
InputStream is =new BufferedInputStream(new FileInputStream("baidu.html"));
OutputStream os =new BufferedOutputStream(client.getOutputStream());
byte[] flush =new byte[1024];
int len = -1;
while((len=is.read(flush))!=-1) {
os.write(flush,0,len);
}
os.flush();
//3、释放资源
os.close();
is.close();
client.close();
}
}
UDP:
User DatagramProtocol
一种无连接的传输层协议,提供面向事
务的简单不可靠信息传送服务。
特点
•
非面向连接,传输不可靠,可能丢失
•
发送不管对方是否准备好,接收方收
到也不确认
•
可以广播发送
•
非常简单的协议,开销小,基于报文
操作
主要涉及到两个类。
DatagramSocket:用于发送或接收数据包的套接字
DatagramPacket:数据包
下面就接受发送信息来看看:
发送步骤:
1、使用DatagramSocket 指定端口 创建发送端
2、准备数据 ,一定转成字节数组
3、封装成DatagramPacket 包裹,需要指定目的地
4、发送包裹send(DatagramPacket p)
5、释放资源
接受步骤:
1、使用DatagramSocket 指定端口 创建接收端
2、准备容器 封装成DatagramPacket 包裹
3、阻塞式接收包裹receive(DatagramPacket p)
4、分析数据
5、释放资源
示例:
发送端
System.out.println("发送方启动中.....");
// 1、使用DatagramSocket 指定端口 创建发送端
DatagramSocket client =new DatagramSocket(8888);
//2、准备数据 一定转成字节数组
String data = "悟空最牛皮";
byte[] datas = data.getBytes();
//3、封装成DatagramPacket 包裹,需要指定目的地
DatagramPacket packet =new DatagramPacket(datas,0,datas.length,
new InetSocketAddress("localhost",6666));
//4、发送包裹send(DatagramPacket p) *
client.send(packet);
// 5、释放资源
client.close();
接收端:
System.out.println("接收方启动中.....");
// 1、使用DatagramSocket 指定端口 创建接收端
DatagramSocket server =new DatagramSocket(6666);
// 2、准备容器 封装成DatagramPacket 包裹
byte[] container =new byte[1024*60];
DatagramPacket packet = new DatagramPacket(container,0,container.length);
// 3、阻塞式接收包裹receive(DatagramPacket p)
server.receive(packet); //阻塞式
// 4、分析数据
byte[] datas =packet.getData();
int len = packet.getLength();
System.out.println(new String(datas,0,len));
// 5、释放资源
server.close();
TCP与UDP的区别
1.TCP基于连接与UDP无连接﹔
2.对系统资源的要求:TCP较多,UDP少;
3.UDP程序结构较简单;
4.TCPS是流模式,UDP是数据报模式;
5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证;
UDP和TCP协议的主要区别是两者在如何实现信息的可靠传递方面不同。
TCP协议中包含了专门的传递保证机制,当数据接收方收到发送方传来的信息时,会自动向发送方发出确认消息,发送方只有在接收到该确认消息之后才继续传送其它信息,否则将一直等待直到收到确认信息为止。与TCP不同,UDP协议并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据报的丢失,协议本身并不能做出任何检测或提示。因此,通常人们把UDP协议称为不可靠的传输协议。相对于TCP协议,UDP协议的另外一个不同之处在于如何接收突发性的多个数据报。不同于TCP, UDP并不能确保数据的发送和接收顺序。
关注公众号,可以免费获取毕业设计项目、各种免费软件、资料,笔记哦。