当前位置: 首页 > news >正文

[ java 网络 ] TPC与UDP协议

目录

1.计算机网络    

2.网络通讯模型

3.网络通讯基本要素

(1) ip (Internet Protocol Address) : 

(2) 端口 :     

(3) 通讯协议 : 

         a. 传输控制协议TCP 

             a1. 三次握手和四次挥手

             a2. Socket套接字

         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间的通信

   发送纯文本:

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();//打印异常信息}}
}
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();//打印异常信息}}
}

  流程分析: 

         发送文件(图片):

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("系统匆忙,请稍后再试");}}
}
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) 封装成数据包,不需要建立连接就可以发送(不可靠),如果网络有问题,没有任何反馈  不存在服务器和客户端,只有发送端和接受端

   发送者:

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);}}
}

  接收者

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);}}
}

http://www.dtcms.com/a/309242.html

相关文章:

  • 微波(Microwave)与毫米波(Millimeter wave)简介
  • 动态域名解析(DDNS)到底有什么用?
  • OSPF综合大实验
  • 下次接好运~
  • Oracle EBS 缺少adcfgclone.pl文件
  • 一分钟了解IO-Link 系列集线器
  • LaTeX 复杂图形绘制教程:从基础到进阶
  • Deep Height Decoupling for Precise Vision-based 3D Occupancy Prediction
  • 数据结构前篇 - 深入解析数据结构之复杂度
  • Leetcode——53. 最大子数组和
  • 如何将消息转移到新 iPhone
  • 如何将联系人从三星手机转移到 iPhone
  • MySQL 高并发下如何保证事务提交的绝对顺序?
  • 转换图(State Transition Diagram)和时序图(Sequence Diagram)画图流程图工具
  • 新手向:国内外大模型体验与评测
  • 智能图书馆管理系统开发实战系列(四):后端C++ DLL开发与模块化设计
  • 一种新的分布式ID生成方案--ULID
  • ABP VNext + Dapr Workflows:轻量级分布式工作流
  • (AC)唐克的新游戏
  • Vue3中Markdown解析与渲染的完整解决方案:从安全到性能优化
  • PostgreSQL 中删除指定数据库下的所有表结构
  • 微服务的编程测评系统9-竞赛新增-竞赛编辑
  • 如何保护 Redis 实例的安全?
  • 快速排序算法详解与洛谷例题实战
  • 【PHP 构造函数与析构函数:从基础到高级的完整指南】
  • 直播平台中的美白滤镜实现:美颜SDK的核心架构与性能优化指南
  • Qt结合ffmpeg实现图片参数调节/明亮度对比度饱和度设置/滤镜的使用
  • Windows编译安装ffmpeg和sdl
  • CG--逻辑判断1
  • 实战指南:如何将Git仓库中的特定文件夹及其历史完整迁移到另一个仓库