运输层的两个主要协议
- UDP
- UDP 是无连接的,即发送数据之前不需要建立连接,(当然,发送数据结束时也没有连接可释放),因此减少了开销和发送数据的时延。
- UDP 使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表
- UDP 是面向报文的,发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付 IP 层
- UDP 没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低
- UDP 的首部开销小,只有8个字节,比 TCP 的20个字节的首部要短。 - TCP
- TCP 是面向连接的运输层协议,就是说,应用程序在使用 TCP 协议前,必须建立 TCP 连接。在传输结束后,必须释放已经建立的 TCP 连接,类似于打电话,:通话之前先拨号建立连接,通话之后要挂机释放连接。
- 每一条 TCP 连接只能由两个端点,每一条 TCP连接只能是点对点的。
- TCP提供可靠交付的服务。通过TCP 连接传送的数据,无差错,不丢失,不重复,并且按序到达。
- TCP提供全双工通信,TCP允许通信双方的应用进程在任何时候都能够发送数据,TCP连接的两端都设有发送缓存和接受缓存,用来临时存放双向通信的数据。
- 面向字节流。TCP中的流指的是流入到进程或者是从进程流出的字节序列,面向字节流的含义是:虽然应用程序和TCP的交互是一次一个数据块,但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。
1.基于TCP协议的Scoket编程
服务端
import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
//开启一个监听端口
ServerSocket socket = new ServerSocket(8080);
while (true){
//等待连接
Socket accept = socket.accept();
System.out.println("服务器连接成功");
//获得客户端传入的数据流
DataInputStream dataInputStream = new DataInputStream(accept.getInputStream());
String s = dataInputStream.readUTF();
//读取数据
System.out.println(s);
if (s.equals("exit")){
break;
}
}
socket.close();
}
}
客户端
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = null;
while (true){
//创建一个连接将其连接到指定的IP地址的指定端口号
socket = new Socket("127.0.0.1", 8080);
System.out.println("客户端连接成功");
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
dataOutputStream.writeUTF(s);
if (s.equals("exit")){
break;
}
}
socket.close();
}
}
1.基于UDP协议的Scoket编程
发送方
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class peopleTwo {
public static void main(String[] args) throws IOException {
//发送方
//指定一个端口
DatagramSocket socket = new DatagramSocket();
//指定一个IP
InetAddress address = InetAddress.getByName("127.0.0.1");
int port = 8080;
//准备一个容器
byte[] sendBuf;
while (true){
System.out.println("你要发送什么东西");
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
//加入要发送的数据
sendBuf = s.getBytes();
//数据打包
DatagramPacket packet = new DatagramPacket(sendBuf, sendBuf.length,address,port);
socket.send(packet);
if(s.equals("exit")){
break;
}
}
socket.close();
}
}
接收方
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class peopleOne {
//UDP是无连接的
public static void main(String[] args) throws IOException {
//接收方
//1开放一个端口
DatagramSocket socket = new DatagramSocket(8080);
//2.准备一个容器接受
byte[] receBuf = new byte[100];
//等待包裹容器收包
DatagramPacket packet = new DatagramPacket(receBuf, receBuf.length);
while (true){
//接受包裹
socket.receive(packet);
//解析包裹
String s = new String(packet.getData(), 0, packet.getLength());
//输出文件
System.out.println(s);
if(s.equals("exit")){
break;
}
}
//释放资源
socket.close();
}
}