JAVA面向网络编程,了解TCP,UDP协议
- 什么是TCP协议
- 什么是UDP通信协议
- 使用场景
什么是TCP协议
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 定义。
- 应用层次: 传输层
- 主要特点: TCP是一种面向广域网的通信协议,目的是在跨越多个网络通信时,为两个通信端点之间提供一条具有下列特点的通信方式:
a,基于流的方式; b,面向连接; c,可靠通信方式; d,在网络状况不佳的时候尽量降低系统由于重传带来的带宽开销;
e,通信连接维护是面向通信的两个端点的,而不考虑中间网段和节点。 - 优点: 稳定,安全
- 缺点: 慢,效率低,占用系统资源高。
- JAVA中TCP通信依赖于
- 下面是有tcp实现的两人聊天的代码:
这是客户端的代码:
package com.wdhcr.tcp;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
/*
* 使用tcp传输协议,这是客户端
*
*
* */
public class Client {
public static void main(String[] args) {
//创建键盘录入对象
Scanner scanner = new Scanner(System.in);
String data = null;
//声明变量
Socket socket = null;
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;
try {
//设置通信连接配置
//这里的端口号可以自定义一个整型数,但必须和服务端设置的一致。
socket = new Socket("localhost", 8888);
//读取socket连接的数据
bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//向连接发送数据
bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//定义标识位
boolean flag = true;
while (flag) {
System.out.println("客户端:");
data = scanner.next();
//写入数据
bufferedWriter.write(data);
//增加换行
bufferedWriter.newLine();
//刷新buffered缓冲池
bufferedWriter.flush();
//读取服务端的数据
String SData = bufferedReader.readLine();
if ("exit".equals(data) || "exit".equals(SData)){
flag = false;
break;
}
//打印连接的数据
System.out.println("服务端:" + SData);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭资源
try {
socket.close();
bufferedReader.close();
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
这是服务端的代码:
package com.wdhcr.tcp;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
/*
*
* 这是tcp通信的 服务端
* */
public class Server {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//定义字符串变量
String data = null;
//声明变量
ServerSocket serverSocket = null;
BufferedWriter bufferedWriter = null;
BufferedReader bufferedReader = null;
try {
//这里的端口号可以自定义一个整型数,但必须和客户端设置的一致。
serverSocket = new ServerSocket(8888);
System.out.println("服务端建立连接成功!!");
//监听socket是否有数据,这个方法是阻塞式的
Socket accept = serverSocket.accept();
//这是连接写入对象
bufferedWriter = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
//这是读取连接数据对象
bufferedReader = new BufferedReader(new InputStreamReader(accept.getInputStream()));
//定义标识符
boolean flag = true;
while (flag) {
//读取连接的数据
String Cdata = bufferedReader.readLine();
if ("exit".equals(data) || "exit".equals(Cdata)) {
flag = false;
break;
}
System.out.println("客户端:" + Cdata);
//向客户端发送数据
System.out.println("服务端:");
data = scanner.next();
//写入数据
bufferedWriter.write(data);
//换行
bufferedWriter.newLine();
//刷新buffered的缓冲池
bufferedWriter.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
//关闭资源
serverSocket.close();
bufferedReader.close();
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- 以上代码就是用java代码基于tcp通信协议实现的简单的聊天功能。
什么是UDP通信协议
Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据报的方法。RFC 描述了 UDP。
- 应用层次: 传输层
- 用途: 发送IP数据报
- 特点: 无连接、不可靠、快速传输
- 优点: 速度快,
- 缺点: 不可靠,不稳定
- JAVA中使用UDP通信协议依赖于
- 下面是有udp实现的两人聊天的代码:
这是发送端的代码:
package com.wdhcr.udp;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class Send {
public static void main(String[] args) throws IOException {
//创建socket
DatagramSocket datagramSocket = new DatagramSocket();
//创建键盘录入对象
Scanner scanner = new Scanner(System.in);
//定义标识位
boolean flag = true;
while (flag) {
System.out.println("请输入你要发送的数据:");
String data = scanner.next();
byte[] bytes = data.getBytes();
//包装数据
DatagramPacket localhost =
new DatagramPacket(bytes, bytes.length, InetAddress.getByName("localhost"), 8888);
//发送数据
datagramSocket.send(localhost);
//当输入exit时结束
if ("exit".equals(data)) {
flag = false;
}
}
//关闭资源
datagramSocket.close();
}
}
这是接收端的代码:
package com.wdhcr.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/*
*创建服务器,加端口号
* 准备接收的容器
* 封装成包,接收数据
* 读取数据,处理数据
*打印
* 关闭资源
* */
public class Receive {
public static void main(String[] args) throws IOException {
//创建服务器
DatagramSocket datagramSocket = new DatagramSocket(8888);
System.out.println("服务器开启成功!");
//定义接收的容器
byte[] bytes = new byte[1024];
//封装包
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
//定义标识位
boolean flag = true;
while (flag) {
//接收数据
datagramSocket.receive(datagramPacket);
//读取数据
byte[] data = datagramPacket.getData();
//获取长度
int length = datagramPacket.getLength();
String s = new String(data, 0, length);
System.out.println("接受的数据是:" + s);
//当接收的数据为exit时结束程序
if ("exit".equals(s)){
flag = false;
}
}
//关闭资源
datagramSocket.close();
}
}
- 以上代码是java基于udp通信协议实现数据的发送和接收
使用场景
通过以上特点,可以看出tcp是可靠的但传输速度慢 ,udp 是不可靠的但传输速度快。因此在选用具体协议通信时,应该根据通信数据的要求而决定。 若通信数据完整性需让位与通信实时性,则应该选用 tcp 协议(如文件传输、重要的更新等);反之,则使用 udp 协议(如视频传输、实时通信等)。