用Socket实现网络通信

news2024/10/4 21:16:58

文章目录

  • 背景
    • 网络编程
    • 网络编程三要素
  • 2.Socket之UDP通信程序
    • 2.1 UDP发送数据
    • 2.2UDP接收数据
  • 3. Socket之TCP通信程序
    • 3.1TCP发送数据
    • 3.2TCP接收数据

背景

网络编程

● 计算机网络
是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统
● 网络编程
在网络通信协议下,不同计算机上运行的程序,可以进行数据传输

网络编程三要素

● IP地址
要想让网络中的计算机能够互相通信,必须为每台计算机指定一个标识号,通过这个标识号来指定要接收数据的计算机和识别发送的计算机,而IP地址就是这个标识号。也就是设备的标识
在这里插入图片描述

● 端口
网络的通信,本质上是两个应用程序的通信。每台计算机都有很多的应用程序,那么在网络通信时,如何区分这些应用程序呢?如果说IP地址可以唯一标识网络中的设备,那么端口号就可以唯一标识设备中的应用程序了。也就是应用程序的标识
在这里插入图片描述

● 协议
通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样。在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据交换。常见的协议有UDP协议和TCP协议
在这里插入图片描述

2.Socket之UDP通信程序

2.1 UDP发送数据

  • Java中的UDP通信

    • UDP协议是一种不可靠的网络协议,它在通信的两端各建立一个Socket对象,但是这两个Socket只是发送,接收数据的对象,因此对于基于UDP协议的通信双方而言,没有所谓的客户端和服务器的概念
    • Java提供了DatagramSocket类作为基于UDP协议的Socket
  • 构造方法

    方法名说明
    DatagramSocket()创建数据报套接字并将其绑定到本机地址上的任何可用端口
    DatagramPacket(byte[] buf,int len,InetAddress add,int port)创建数据包,发送长度为len的数据包到指定主机的指定端口
  • 相关方法

    方法名说明
    void send(DatagramPacket p)发送数据报包
    void close()关闭数据报套接字
    void receive(DatagramPacket p)从此套接字接受数据报包
  • 发送数据的步骤

    • 创建发送端的Socket对象(DatagramSocket)
    • 创建数据,并把数据打包
    • 调用DatagramSocket对象的方法发送数据
    • 关闭发送端
  • 代码演示

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

2.2UDP接收数据

  • 接收数据的步骤

    • 创建接收端的Socket对象(DatagramSocket)
    • 创建一个数据包,用于接收数据
    • 调用DatagramSocket对象的方法接收数据
    • 解析数据包,并把数据在控制台显示
    • 关闭接收端
  • 构造方法

    方法名说明
    DatagramPacket(byte[] buf, int len)创建一个DatagramPacket用于接收长度为len的数据包
  • 相关方法

    方法名说明
    byte[] getData()返回数据缓冲区
    int getLength()返回要发送的数据的长度或接收的数据的长度
  • 示例代码

    public class ReceiveDemo {
        public static void main(String[] args) throws IOException {
          	//创建接收端的Socket对象(DatagramSocket)
          	DatagramSocket ds = new DatagramSocket(12345);
    
          	//创建一个数据包,用于接收数据
          	byte[] bys = new byte[1024];
          	DatagramPacket dp = new DatagramPacket(bys, bys.length);
    
          	//调用DatagramSocket对象的方法接收数据
          	ds.receive(dp);
    
          	//解析数据包,并把数据在控制台显示
          	System.out.println("数据是:" + new String(dp.getData(), 0,                                             dp.getLength()));
            }
        }
    }
    

3. Socket之TCP通信程序

3.1TCP发送数据

  • Java中的TCP通信

    • Java对基于TCP协议的的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信。
    • Java为客户端提供了Socket类,为服务器端提供了ServerSocket类
  • 构造方法

    方法名说明
    Socket(InetAddress address,int port)创建流套接字并将其连接到指定IP指定端口号
    Socket(String host, int port)创建流套接字并将其连接到指定主机上的指定端口号
  • 相关方法

    方法名说明
    InputStream getInputStream()返回此套接字的输入流
    OutputStream getOutputStream()返回此套接字的输出流
  • 示例代码

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

3.2TCP接收数据

  • 构造方法

    方法名说明
    ServletSocket(int port)创建绑定到指定端口的服务器套接字
  • 相关方法

    方法名说明
    Socket accept()监听要连接到此的套接字并接受它
  • 注意事项

    1. accept方法是阻塞的,作用就是等待客户端连接
    2. 客户端创建对象并连接服务器,此时是通过三次握手协议,保证跟服务器之间的连接
    3. 针对客户端来讲,是往外写的,所以是输出流
      针对服务器来讲,是往里读的,所以是输入流
    4. read方法也是阻塞的
    5. 客户端在关流的时候,还多了一个往服务器写结束标记的动作
    6. 最后一步断开连接,通过四次挥手协议保证连接终止
  • 示例代码

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

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

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

相关文章

Linux文件管理知识:查找文件(第二篇)

上篇文章详细介绍了linux系统中查找文件的工具或者命令程序locate和find命令的基本操作。那么,今天这篇文章紧接着查找文件相关操作内容介绍。 Find命令所属操作列表中的条目,有助于我们想要的结果输出。上篇文章已讲到find 命令是基于搜索结果来执行操作…

VScode 调试python程序,debug状态闪断问题的解决方法

0. Few words 之前一直在VSCode中debug C和Python的程序没出过闪断的问题,但是最近在另一台电脑上debug,同样的方法,设置launch.json和CMakeList加debug状态等等操作,如我另一篇blog写的一样,可以点这里查看。 但是&a…

HarmonyOS—UI开发性能提升的推荐方法

注:本文转载自HarmonyOS官网文档 开发者若使用低性能的代码实现功能场景可能不会影响应用的正常运行,但却会对应用的性能造成负面影响。本章节列举出了一些可提升性能的场景供开发者参考,以避免应用实现上带来的性能劣化。 使用数据懒加载 开…

RT-Thread概述与体验

RTT目录结构 最核心的文件只有5个: src\thread.c:线程相关的文件,比如创建线程、启动线程。src\timer.c:定时器相关的文件。src\scheduler.c:调度器:维护线程的就绪链表、提供临界区的进出函数。src\ipc.c…

CRM系统有哪些类型?如何管理客户关系?

什么是是客户关系管理 Zoho CRM是一种经营策略帮助企业建立客户为中心的企业管理模式同时CRM也是一种技术手段帮助企业建立牢靠的客户关系,实现降本增效的目的。例如建立全渠道沟通,提高客户满意度,跟进客户细分开展个性化的营销活动提高市场…

uniapp--- 微信小程序 用户隐私新规相关代码调整【vue3+ts+uView框架】

uniapp— 微信小程序 用户隐私新规相关代码调整【vue3tsuView框架】 官方公告地址:https://developers.weixin.qq.com/community/develop/doc/00042e3ef54940ce8520e38db61801 用户隐私保护指引填写说明地址:https://developers.weixin.qq.com/miniprogr…

C++信息学奥赛1177:奇数单增序列

#include<bits/stdc.h> using namespace std; int main(){int n;cin>>n; // 输入整数 n&#xff0c;表示数组的大小int arr[n]; // 创建大小为 n 的整型数组for(int i0;i<n;i) cin>>arr[i]; // 输入数组元素for(int i0;i<n;i){ // 对数组进行冒泡排序f…

Resource Hacker下载

下载路径 Resource Hacker (angusj.com)http://www.angusj.com/resourcehacker/#download 应用方法示例 【2023年更新】手把手教你去除 WinRAR 的弹窗广告_winrar广告怎么去除_areosun的博客-CSDN博客https://blog.csdn.net/haiyunzhiqiu/article/details/119176038#comment…

管理类联考——逻辑——形式逻辑——汇总篇——知识点突破——性质模态

性质&模态 角度一 角度二 矛盾关系 【对象】(1)所有、有的不;(2)所有不、有的;(3)某个、某个不。 【典例】①所有偶像都是靠颜值的。 ②有的偶像不是靠颜值的。 试分析: (1)如果①为真,试判断②的真假。 (2)如果①为假,试判断②的真假。 (3)①和②是否可…

u盘提示需要格式化如何恢复里边的数据?你可以这么做

“昨天我和往常一样往U盘传输一些重要文件&#xff0c;突然收到一个提示&#xff1a;说我需要格式化它才能使用&#xff0c;但是我里面有重要的数据&#xff0c;所以我不敢点&#xff0c;可是没法复制出里面的数据&#xff0c;有没有人告诉我&#xff0c;如何恢复里边的数据&am…

【算法与数据结构】106、LeetCode从中序与后序遍历序列构造二叉树

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;首先我们要知道后序遍历数组的最后一个元素必然是根节点&#xff0c;然后根据根节点在中序遍历数组中的…

Zynq GTX全网最细讲解,aurora 8b/10b协议,OV5640板对板视频传输,提供2套工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 GT 高速接口解决方案3、GTX 全网最细解读GTX 基本结构GTX 发送和接收处理流程GTX 的参考时钟GTX 发送接口GTX 接收接口GTX IP核调用和使用 4、设计思路框架视频源选择OV5640摄像头配置及采集动态彩条视频数据组包GTX aurora 8b/10b数据对…

Docker Harbor 私有镜像仓库的部署和管理

目录 一、什么是Harbor 二、Harbor的特性 三、Harbor的构成 四、部署配置Docker Harbor 首先需要安装 Docker-Compose 服务 部署 Harbor 服务 修改配置文件 docker配置文件添加本地仓库地址 关于 Harbor.cfg 配置文件中有两类参数&#xff1a;所需参数和可选参数 &a…

双基证券:游戏版号发放整体趋势的向好将持续优化供给端

双基证券表示&#xff0c;版号发放整体趋势的向好将继续优化供应端&#xff0c;游戏新产品周期正逐渐开启&#xff0c;各家游戏公司盈余端将逐渐企稳&#xff0c;同时将推进游戏商场规划进一步增加。长时间来看&#xff0c;AIGC等技术对游戏全工业链具有降本增效&#xff0c;提…

节日书单视频怎么制作?这个工具不要错过

节日书单视频制作是一项具有一定专业性和科普性质的任务。在制作节日书单视频时&#xff0c;我们需要注意一些方法和注意事项&#xff0c;以确保视频的质量和效果。本文将介绍一些关键的步骤和技巧&#xff0c;帮助您顺利完成节日书单视频的制作。 编辑制作节日书单视频的话&am…

Python2021年9月Python二级 -- 编程题解析

题目一: 日期转换 编写一个程序&#xff0c;实现用户输入一个日期&#xff0c;格式为"月/日/年"&#xff0c;如输入05/21/2021&#xff0c;程序输出日期为’May 21,20211至12月的英文名称如下: January,February,March,April, May, June, July&#xff0c;August, Se…

YOLO目标检测——人脸表情识别数据集下载分享

受试者在15个视点和19个照明条件下成像&#xff0c;同时显示一系列面部表情&#xff0c;资源包括PIE照明子集&#xff08;1154张人脸灰度图&#xff0c;3232&#xff09;和三个Pose05、Pose07、Pose09子集&#xff08;分别包括3332张、1629张、859张人脸灰度图&#xff0c;6464…

RTP协议简介

介绍 RTP&#xff0c;real-time transport protocol&#xff0c;实时传输协议&#xff0c;用于传输具有实时属性的数据。RTP提供端到端的网络传输功能&#xff0c;适用于通过组播或单播网络服务传输实时数据(如音频、视频或仿真数据)的应用。 RTP协议层有两个子协议&#xff…

构建稳定的爬虫系统:如何选择合适的HTTP代理服务商

在构建一个稳定、高效的爬虫系统中&#xff0c;选择合适的HTTP代理服务商是至关重要的一步。本文将介绍如何选取可靠且性能优秀的HTTP代理服务供应商&#xff0c;来完成搭建一个强大而稳定的爬虫系统。 1.了解不同类型和特点 -免费公开代理服务器:提供免费但可能存在限制或不…

C++信息学奥赛1179:奖学金

#include<bits/stdc.h> using namespace std; int main(){int n;cin>>n; // 输入整数 n&#xff0c;表示数组的大小int id[n], arr[n], brr[n], crr[n]; // 创建大小为 n 的整型数组 id, arr, brr, crrfor(int i0;i<n;i) {id[i] i1; // 初始化 id 数组为 1,2,3…