JAVA面向网络编程,了解TCP,UDP协议

  • 什么是TCP协议
  • 什么是UDP通信协议
  • 使用场景


什么是TCP协议

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 定义。

  • 应用层次: 传输层
  • 主要特点: TCP是一种面向广域网的通信协议,目的是在跨越多个网络通信时,为两个通信端点之间提供一条具有下列特点的通信方式:
    a,基于流的方式; b,面向连接; c,可靠通信方式; d,在网络状况不佳的时候尽量降低系统由于重传带来的带宽开销;
    e,通信连接维护是面向通信的两个端点的,而不考虑中间网段和节点。
  • 优点: 稳定,安全
  • 缺点: 慢,效率低,占用系统资源高。
  • JAVA中TCP通信依赖于
  • java ioc框架 javatcp框架_tcp


  • java ioc框架 javatcp框架_udp_02

  • 下面是有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通信协议依赖于

java ioc框架 javatcp框架_java ioc框架_03


java ioc框架 javatcp框架_网络编程_04


- 下面是有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 协议(如视频传输、实时通信等)。