[ java 网络 ] TPC与UDP协议

目录

1.计算机网络

2.网络通讯模型

3.网络通讯基本要素

[(1) ip (Internet Protocol Address) :](#(1) ip (Internet Protocol Address) :)

[(2) 端口 :](#(2) 端口 :)

[(3) 通讯协议 :](#(3) 通讯协议 :)

[a. 传输控制协议TCP](#a. 传输控制协议TCP)

[a1. 三次握手和四次挥手](#a1. 三次握手和四次挥手)

[a2. Socket套接字](#a2. Socket套接字)

[b. 用户数据报协议UDP](#b. 用户数据报协议UDP)


1.计算机网络

把分布在不同地理区域的具有独立功能的计算机,通过通信设备与线路连接起来,由功能完善的软件实现资源共享信息传递系统网络编程 的目的是直接或间接 地通过网络 与其它计算机实现数据交换

2.网络通讯模型

应用层 (数据)----传输层 (协议)----网络层 (ip+端口)----数据链路层(实际通讯设备 网线 光纤)

3.网络通讯基本要素

(1) ip (Internet Protocol Address ) :

计算机网络协议地址 , 连接路由器 , 路由器会为我们的电脑分配一个唯一的ip地址

查看ip地址的方法 : win+R----输入cmd----输入ipconfig----回车

ip地址 : 局域网地址 :192.168.xx.xx 本地回环地址:127.0.0.1(指向自己的电脑)

(2) 端口 :

电脑上的每一个应用程序 (QQ 微信)都会有一个唯一端口号(整数 取值范围为0~65535)

端口号举例 : MySQL(3306) SQLServer(1433) Oracle(1521)

注意 : 理解 端口号IP :

(3) 通讯协议 :

1.定义

计算机网络通信 时必须实现的一些约定(通信协议)

对速率 传输代码 代码结构 传输控制步骤 出错控制 等制定标准

2.分类:

a. 传输控制协议TCP

Transmission Control Protocol 采用两个应用进程(服务端客户端)

a1. 三次握手和四次挥手

(传输前)**三次握手 :**检查网络是否通畅,如果网络通畅才进行数据传输

(断开时)四次挥手 : 相比UDP协议更可靠,但是效率较低

a2. Socket套接字

Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输

两台机器间通信的端点是Socket. 通信的两端都要有Socket

网络通信其实就是Socket间的通信

发送纯文本:

java 复制代码
package TCP.TCPsocket;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class Client {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("127.0.0.1",9999);//(ip地址,端口号)
            Scanner scanner = new Scanner(System.in);
                while(true){  System.out.println("客户端输入:");
                String s = scanner.next();

                //IO 通过socket获得输出流对象,从客户端向服务器发送消息
                OutputStream outputStream = socket.getOutputStream();//节点流
                DataOutputStream dataOutputStream = new DataOutputStream(outputStream);//数据处理流
                dataOutputStream.writeUTF(s);

                //在客户端接收服务器发送的消息
                InputStream inputStream = socket.getInputStream();
                DataInputStream dataInputStream = new DataInputStream(inputStream);
                System.out.println(dataInputStream.readUTF());
            }
        }catch(IOException e){
            System.out.println("服务端链接失败");
            e.printStackTrace();//打印异常信息
        }
    }
}
java 复制代码
package TCP.TCPsocket;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {//先启动服务器,在启动客户端(服务器必须事先建立一个等待客户请求建立套接字连接的ServerSocket对象)
    public static void main(String[] args) {
        try {   //创建服务器套接字,并绑定到指定的端口上
                ServerSocket serverSocket = new ServerSocket(9999);
                System.out.println("服务端起启动成功");
                //监听客户端链接,接收成功返回套接字对象
                Socket socket =serverSocket.accept();
                System.out.println("客户端链接成功");
                Scanner scanner = new Scanner(System.in);
                //在服务器接收客户端发送的消息
                while (true){
                //调用该Socket类对象的 getOutputStream()和getInputStream():获取输出流和输入流,进行网络数据的发送和接收。
                InputStream inputStream= socket.getInputStream();
                DataInputStream dataInputStream =new DataInputStream(inputStream);//数据处理流,将其转为String类型的字符串
                  String msg =  dataInputStream.readUTF();
                System.out.println(msg);
                //从服务器向客户端发送信息
                OutputStream outputStream = socket.getOutputStream();
                DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
                System.out.println("服务器端输入:");
                String s = scanner.next();
                dataOutputStream.writeUTF(s);
            }
        }catch (IOException e) {
            System.out.println("客户端链接失败");
            e.printStackTrace();//打印异常信息
        }
    }
}

流程分析:

发送文件(图片):

java 复制代码
package TCP.TCPfilesocket;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
    public static void main(String[] args) {
        try {
            FileInputStream inputStream = new FileInputStream("D:a.png");//要发送给服务器的文件(图片 纯文本...)
            Socket socket = new Socket("127.0.0.1",9999);//(服务器ip,服务器端口)
            OutputStream outputStream = socket.getOutputStream();//输出流,发送到服务器

            byte[] bytes = new byte[100];
            int length = 0;
            while((length=inputStream.read(bytes))!=-1){//读取要发送的文件
              outputStream.write(bytes,0,length);
            }
            socket.shutdownInput();//发送文件时需要调用,表示发送完成
            inputStream.close();
            outputStream.close();

        } catch (UnknownHostException e) {
            System.out.println("ip不正确");
        } catch (FileNotFoundException e) {
            System.out.println("文件找不到");
        } catch (IOException e) {
            System.out.println("系统匆忙,请稍后再试");
        }
    }
}
java 复制代码
package TCP.TCPfilesocket;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket();
            Socket socket = serverSocket.accept();//监听客户端链接

            FileOutputStream fileOutputStream = new FileOutputStream("D:/a.txt");//服务器端 接收文件的地址
            InputStream inputStream =socket.getInputStream();
            byte[] bytes = new byte[100];
            int length=0;
            while ((length=inputStream.read(bytes))!=-1){
                fileOutputStream.write(bytes,0,length);
            }

            DataOutputStream dataoutputStream = new DataOutputStream(socket.getOutputStream());//数据处理流
            dataoutputStream.writeUTF("接收成功");

        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }
}
b. 用户数据报协议UDP

User Datagram Protocol

数据 (发送者IP)、目的地 (接受者IP) 封装成数据包,不需要建立连接就可以发送 (不可靠),如果网络有问题,没有任何反馈不存在服务器和客户端,只有发送端和接受端

发送者:

java 复制代码
package UDP;
import java.io.IOException;
import java.net.*;
public class Send { //发送者
    public static void main(String[] args) {
        try {
            DatagramSocket datagramSocket = new DatagramSocket();//发送端这里不需要写端口号,因为数据包中有
            byte[] bytes = "你好".getBytes();//将字符串转为字节数组
             //DatagramPacket用于封装, DatagramSocket用于发送和接收
            DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("127.0.0.1"),9999);
            //                 数据包                         要封装数组  数组的长度                            IP    端口号
            datagramSocket.send(datagramPacket);//要发送的数据包

        }catch (SocketException e){
            throw new RuntimeException(e);
        }catch (UnknownHostException e){
            throw new RuntimeException(e);
        }catch (IOException e){
            throw new RuntimeException(e);
        }
    }
}

接收者

java 复制代码
package UDP;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class Recieve { //接受者
    public static void main(String[] args) {
        try {//创建一个发送接收对象,需要写端口号
            DatagramSocket datagramSocket = new DatagramSocket(9999);

            byte[] bytes = new byte[100];//创建数组
            DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);//数据包对象
            datagramSocket.receive(datagramPacket);//接收数据到数据包(bytes数组)中

            String s = new String(bytes,0,datagramPacket.getLength());
            System.out.println(s);

        } catch (SocketException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
相关推荐
YuTaoShao1 小时前
【LeetCode 热题 100】139. 单词拆分——(解法一)记忆化搜索
java·算法·leetcode·职场和发展
Best_Liu~2 小时前
策略模式 vs 适配器模式
java·spring boot·适配器模式·策略模式
direction__2 小时前
Java Main无法初始化主类的原因与解决方法(VsCode工具)
java·vscode
帧栈2 小时前
开发避坑指南(29):微信昵称特殊字符存储异常修复方案
java·mysql
每天的每一天2 小时前
面试可能问到的问题思考-Redis
java
青草地溪水旁3 小时前
如何理解AP服务发现协议中“如果某项服务需要被配置为可通过多个不同的网络接口进行访问,则应为每个网络接口使用一个独立的客户端服务实例”?
网络·服务发现·客户端实例
青云交3 小时前
Java 大视界 -- Java 大数据在智能安防人脸识别系统中的活体检测与防伪技术应用
java·大数据·生成对抗网络·人脸识别·智能安防·防伪技术·活体测试
学习至死qaq3 小时前
信创产品TongLinkQ安装及springboot2整合使用
java·东方通·tonglinkq
我崽不熬夜3 小时前
Java中基本的输入输出(I/O)操作:你知道如何处理文件吗?
java·后端·java ee
门思科技3 小时前
LoRaWAN 的网络拓扑全解析:架构、原理与应用实践
服务器·网络·人工智能·科技·物联网·架构