Java网络编程-Socket实现数据通信

news2024/12/24 13:44:00

文章目录

  • 前言
  • 网络编程三要素
    • IP地址和端口号
    • 传输协议
    • Socket
  • 使用Scoket实现网络通信
    • TCP
      • TCP通信-发送方
      • TCP通信-接收方
      • 结果
    • UDP
      • UDP通信-发送方
      • UDP通信-接收方
      • 结果
  • 总结

前言

本文主要是为下一篇Websockt做铺垫,大家了解socket的一些实现。

网络编程三要素

网络编程是指利用计算机网络进行程序设计、开发的技术。网络编程主要包含三个要素,分别是:

  • IP地址和端口号
  • 传输协议
  • Socket

IP地址和端口号

在计算机网络中,每台计算机都有一个IP地址,用于唯一标识该计算机在网络中的位置。IP地址由32位二进制数表示,通常采用点分十进制表示法,如192.168.1.1。

端口号是指计算机中应用程序与网络之间进行交互时,用于标识该应用程序的一个标识符。端口号是一个16位的无符号整数,取值范围为0-65535,其中0-1023为系统保留端口号,一般用于系统服务。

传输协议

在互联网中,主要有两种传输协议,分别是TCP协议和UDP协议。

TCP协议是一种可靠的面向连接的传输协议。在TCP协议中,数据传输前需要先建立连接,通过三次握手进行确认,保证数据传输的可靠性。TCP协议适用于对数据传输可靠性要求较高的应用场合,如文件传输、电子邮件等。

UDP协议是一种不可靠的无连接传输协议。在UDP协议中,数据在传输过程中不需要建立连接,也不需要进行数据确认。UDP协议适用于对数据传输可靠性要求较低的应用场合,如音视频传输、在线游戏等。

Socket

Socket是一种通信协议,可以实现不同计算机之间的网络通信。使用Socket开发网络应用程序,可以实现客户端与服务器之间的数据交换,比如网页数据、文件传输等。在Java中,可以使用Socket类实现TCP协议的Socket连接。客户端通过创建Socket对象并指定服务端的IP地址和端口号来连接服务端。服务端通过创建ServerSocket对象并监听客户端的请求,等待客户端连接。

使用Scoket实现网络通信

TCP

TCP通信-发送方

public class Client {
    public static void main(String[] args) throws IOException {
        //TCP协议,发送数据

        //1.创建Socket对象
        //细节:在创建对象的同时会连接服务端
        //      如果连接不上,代码会报错
        Socket socket = new Socket("127.0.0.1",10000);

        //2.可以从连接通道中获取输出流
        OutputStream os = socket.getOutputStream();
        //写出数据
        os.write("aaa".getBytes());

        //3.释放资源
        os.close();
        socket.close();
    }
}

TCP通信-接收方

public class Server {
    public static void main(String[] args) throws IOException {
        //TCP协议,接收数据

        //1.创建对象ServerSocker
        ServerSocket ss = new ServerSocket(10000);

        //2.监听客户端的链接
        Socket socket = ss.accept();

        //3.从连接通道中获取输入流读取数据
        InputStream is = socket.getInputStream();
        int b;
        while ((b = is.read()) != -1){
            System.out.println((char) b);
        }

        //4.释放资源
        socket.close();
        ss.close();
    }
}

结果

在这里插入图片描述

UDP

UDP通信-发送方

package com.utils;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 * @BelongsProject: CSDN_score
 * @BelongsPackage: com.utils
 * @Author:qiutianshuo
 * @Description:
 * @CreateTime: 2023-09-01 11:24
 * @Version: 1.0
 */
public class SendDemo {
    public static void main(String[] args) throws IOException {
        //创建发送端的Socket对象(DatagramSocket)
        // DatagramSocket() 构造数据报套接字并将其绑定到本地主机上的任何可用端口
        DatagramSocket ds = new DatagramSocket();

        //创建数据,并把数据打包
        //DatagramPacket(byte[] buf, int length, InetAddress address, int port)
        //构造一个数据包,发送长度为 length的数据包到指定主机上的指定端口号。
        byte[] bys = "hello,udp,我来了".getBytes();

        DatagramPacket dp = new DatagramPacket(bys,bys.length, InetAddress.getByName("127.0.0.1"),10086);

        //调用DatagramSocket对象的方法发送数据
        //void send(DatagramPacket p) 从此套接字发送数据报包
        ds.send(dp);

        //关闭发送端
        //void close() 关闭此数据报套接字
        ds.close();
    }
}


UDP通信-接收方

package com.utils;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class ReceiveMessageDemo {
    public static void main(String[] args) throws IOException {
        //接收数据



        //1.创建DatagramSocket对象(快递公司)
        //细节:
        //在接收的时候,一定要绑定端口
        //而且绑定的端口一定要跟发送的端口保持一致
        DatagramSocket ds = new DatagramSocket(10086);


        //2.接收数据包
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length);


        //该方法是阻塞的
        //程序执行到这一步的时候,会在这里死等
        //等发送端发送消息
        System.out.println(11111);
        ds.receive(dp);
        System.out.println(2222);


        //3.解析数据包
        byte[] data = dp.getData();
        int len = dp.getLength();
        InetAddress address = dp.getAddress();
        int port = dp.getPort();

        System.out.println("接收到数据" + new String(data,0,len));
        System.out.println("该数据是从" + address + "这台电脑中的" + port + "这个端口发出的");

        //4.释放资源
        ds.close();


    }
}

结果

在这里插入图片描述

总结

网络编程是现代计算机技术中非常重要的一部分,上述三要素是网络编程的基础。要实现网络编程,需要了解IP地址和端口号的概念和使用,掌握TCP协议和UDP协议的特点和使用,以及掌握Socket编程相关知识和技能。同时在实现过程中也需要注意安全性问题,例如加密数据传输、防止数据篡改等。

维度TCP协议UDP协议
传输可靠性面向连接、可靠传输数据无连接、不可靠传输数据
连接方式三次握手连接方式无连接方式
传输效率传输效率较低传输效率较高
数据包大小数据包大小不固定数据包大小固定
应用场景适用于对数据传输可靠性要求较高的应用场合,如文件传输、电子邮件等适用于对数据传输可靠性要求较低的应用场合,如音视频传输、在线游戏等
错误检测支持错误检测和重传机制不支持错误检测和重传机制
拥塞控制有拥塞控制机制,能够避免网络拥塞没有拥塞控制机制,可能导致网络拥塞
数据顺序保证数据传输顺序不保证数据传输顺序
连接数量连接数量受限于系统内存和处理器能力连接数量受限于系统内存和处理器能力

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/964336.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最小二乘法处理线性回归

最小二乘法是一种数学优化技术,用于查找最适合一组数据点的函数。 该方法主要用于线性回归分析,当然,也可用于非线性问题。 开始之前,我们先理解一下什么是回归。 回归:回归是一种监督学习算法,用于建模和…

中国行政区域带坐标经纬度sql文件及地点获取经纬度方法

文章目录 前言一、如何获取某地的经纬度?1.1 搜索百度地图1.2 在下方找到地图开放平台1.3 下滑找到坐标拾取器1.4 使用 二、sql文件2.1 创建表2.2 插入数据 前言 当工作业务上需要涉及地图,给前端返回经纬度等场景,需要掌握区域经纬度的获取…

Unity中Transform移动相关

路程 方向 * 速度 * 时间 参数一:表示位移多少 路程 方向 * 速度 * 时间 参数二:表示 相对坐标系 默认 该参数 是相对于自己坐标系的 相对于世界坐标系的 Z轴 动 始终是朝 世界坐标系 的 Z轴正方向移动 this.transform.Translate(Vector3.forwar…

经管博士必备基础【12】包络定理

当我们知道一个函数的最优解时,我们要求解这一个函数的值函数关于函数中某一个参数的导数,那么就可以使用包络定理。 1. 无约束条件下的包络定理 函数在其极值点处对一个参数(参数不是自变量)取偏导数的结果,等价于这…

【vue2第九章】组件化开发和根组件

组件化开发和根组件 什么是组件化开发? 一个页面可以拆分为多个组件,每个组件有自己的样式,结构,行为,组件化开发的好处就是,便于维护,利于重复利用,提升开发的效率。 便于维护&…

openGauss学习笔记-58 openGauss 高级特性-资源池化

文章目录 openGauss学习笔记-58 openGauss 高级特性-资源池化58.1 特性简介58.2 架构介绍58.3 功能特点58.4 适用场景与限制58.5 手动安装示例58.6 OCK RDMA使用示例58.7 OCK SCRLock使用示例 openGauss学习笔记-58 openGauss 高级特性-资源池化 58.1 特性简介 资源池化特性主…

Mybatis-plus使用@TableField(fill = FieldFill.UPDATE)完成自动填充字段如保存更新时自动更新时间

📚目录 填充策略枚举介绍自定义填充策略枚举的数据测试用例插入填充更新填充 结尾 填充策略枚举介绍 使用mybatis-plus完成字段的填充,使用起来也比较方便,当我们往数据库插入一条数据时我们不需要在给指定字段上new Date() ,而是使用mybatis-plus的注解完成TableFi…

VMware 安装 Centos7 超详细过程

CentOS系统,安装教程可参考以下: 哪些模型需要在Linux下运行,需提前预装Linux系统呢,评论区讨论吧 比如Noah-MP 5.0模型 1.软硬件准备 软件:推荐使用 VMware,我用的是 VMware 12 镜像:CentO…

全脑建模:过去、现在和未来

什么是全脑建模? 全脑建模(WBM)是计算神经科学的子领域,涉及近似全脑神经活动的计算和理论模型。该方法的目标是研究神经活动的宏观时空模式如何由解剖连接结构、内在神经动力学和外部扰动(感觉、认知、药理、电磁等)的相互作用产生。这种宏观现象及其模…

在firefox浏览器下破解hackbar

目录 一、介绍: 二、安装教程 1、打开firefox浏览器插件管理扩展 2、在firefox浏览器下安装老版本Hackbar (1)首先删除之前安装的Hackbar插件: (2)采用从文件安装附件添加组: (3…

Xubuntu16.04系统中解决无法识别exFAT格式的U盘

问题描述 将exFAT格式的U盘插入到Xubuntu16.04系统中,发现系统可以识别到此U盘,但是打不开,查询后发现需要安装exfat-utils库才行。 解决方案: 1.设备有网络的情况下 apt-get install exfat-utils直接安装exfat-utils库即可 2.设备…

Python安装指南(Windows版)

安装python环境 官网下载地址: Download Python | Python.org 我选择3.10.4版本,当然你也可以选择其他版本 安装 安装完成,需要验证是否安装成功。 打开CMD窗口,输入python命令,如果进入如下python窗口则安装成功&…

3D点云处理:栅格化点云(附源码)

文章目录 0. 测试效果1. 基本内容2. 代码实现文章目录:3D视觉个人学习目录微信:dhlddxB站: Non-Stop_目标:将点云进行栅格化操作;应用:一般可应用于点云的体积计算等;0. 测试效果 1. 基本内容 点云栅格化是将三维点云数据投影到二维栅格(或像素)网格上的过程。这种操作…

无涯教程-JavaScript - QUARTILE函数

QUARTILE函数取代了Excel 2010中的QUARTILE.INC函数。 描述 该函数返回数据集的四分位数。四分位数通常用于销售和调查数据中,以将人群分为几类。 语法 QUARTILE (array,quart)争论 Argument描述Required/OptionalArrayThe array or cell range of numeric values for whi…

SpringBoot-学习笔记(基础)

文章目录 1. 概念1.1 SpringBoot快速入门1.2 SpringBoot和Spring对比1.3 pom文件坐标介绍1.4 引导类1.5 修改配置1.6 读取配置1.6.1 读取配置信息1.6.2 读取配置信息并创建类进行封装 1.7 整合第三方技术1.7.1 整合JUnit1.7.1 整合Mybatis1.7.1 整合Mybatis-Plus1.7.1 整合Drui…

stm32HAL库 G4 SPI 从机DMA可变长度接受数据乱码问题

使用一个引脚当作SPI CS, 边沿触发; 在电平位0时候接受SPI数据20个字节 如果实际主机只发了小于20字节时候, 下一个帧就会错乱; 去老外找了之后,需要复位SPi RCC时钟才能复位掉SPI 下面的不行 正确的做法

Redis集群操作-----主从互换

一、将节点cluster1的主节点7000端口的redis关掉 [rootredis-cluster1 src]# ps -ef |grep redis 二、查看集群信息:

JavaScript实现系统级别的取色器、EyeDropper、try、catch、finally

文章目录 效果图htmlJavaScript关键代码EyeDroppertry...catch颜色值相减(色差)的传送门 效果图 html <div class"d_f fd_c ai_c"><button id"idBtn" class"cursor_pointer">开始取色</button><div id"idBox" c…

Java-Optional类

概述 Optional是JAVA 8引入的一个类&#xff0c;用于处理可能为null的值。 利用Optional可以减少代码中if-else的判断逻辑&#xff0c;增加代码的可读性。且可以减少空指针异常的发生&#xff0c;增加代码的安全性。 常用的方法 示例 代码 public class OptionalTest {pub…

我能“C“——指针进阶(上)

目录 指针的概念 1. 字符指针 2. 指针数组 3. 数组指针 3.1 数组指针的定义 3.2 &数组名VS数组名 3.3 数组指针的使用 4. 数组参数、指针参数 4.1 一维数组传参 4.2 二维数组传参 4.3 一级指针传参 4.4 二级指针传参 5. 函数指针 阅读两段有趣的代码&…