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

Socket通信

优质博文IT-BLOG-CN

一、简介

Socket套接字:描述了计算机的IP地址和端口,运行在计算机中的程序之间采用socket进行数据通信。通信的两端都有socket,它是一个通道,数据在两个socket之间进行传输。socket把复杂的TCP/IP协议族隐藏在socket接口后面,对程序员来说,只要用好socket相关的函数,就可以完成数据通信。

TCP提供了流stream和数据报datagram两种通信机制,所以套接字也分为流套接字和数据报套接字:
【1】流套接字的类型是SOCK_STREAM,它提供的是一个有序、可靠、双向字节流的连接,因此发送的数据可以确保不会丢失、重复或乱序到达,而且它还有出错后重新发送的机制。
【2】数据报套接的类型是SOCK_DGRAM,它不需要建立和维持一个连接,采用UDP/IP协议实现。它对可以发送的数据的长度有限制,数据报作为一个单独的网络消息被传输,它可能会丢失、复制或错乱到达,UDP不是一个可靠的协议,但是它的速度比较高,因为它不需要建立和维持连接。

常见面试题:TCP与UDP的区别

TCP(传输控制协议)和UDP(用户数据报协议)是两种常见的互联网传输协议,它们在数据传输方面有以下区别:
【1】连接性: TCP是面向连接的协议,而UDP是无连接的协议。TCP在传输数据之前需要先建立连接,而UDP则直接发送数据包。
【2】可靠性: TCP提供可靠的数据传输,它使用确认、重传和流量控制等机制来确保数据的完整性和顺序性。而UDP不提供可靠性保证,它只是简单地将数据包发送出去,无法保证数据的到达和顺序。
【3】速度: 由于TCP提供了可靠性保证,它的传输速度相对较慢。而UDP没有额外的机制,传输速度相对较快。
【4】数据量限制: TCP没有固定的数据包大小限制,可以处理任意大小的数据。而UDP的数据包大小有限制,最大为64KB
【5】适用场景: TCP适用于对数据传输可靠性要求较高的场景,例如文件传输、网页浏览等。而UDP适用于对实时性要求较高,但对数据可靠性要求相对较低的场景,例如音视频流媒体、实时游戏等。

总结来说,TCP提供可靠的、面向连接的数据传输,适用于对数据完整性和顺序性要求较高的场景。而UDP提供快速的、无连接的数据传输,适用于对实时性要求较高的场景。

二、Socket通信过程

【1】服务端程序将一个套接字绑定到指定的ip地址和端口,并通过此套接字等待和监听客户的连接请求。
【2】客户程序向服务端程序绑定的地址和端口发出连接请求。
【3】服务端接受连接请求。
【4】客户端和服务端通过读写套接字进行通信。

TCP链接

服务端工作流程:
【1】创建服务端的socket
【2)把服务端用于通信的地址和端口绑定到socket上。
【3】把socket设置为监听模式。
【4】接受客户端的连接。
【5】与客户端通信,接收客户端发过来的报文后,回复处理结果。
【6)不断的重复第5)步,直到客户端断开连接。
【7】关闭socket,释放资源。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;public class Server {public static void main(String[] args) {try {// 创建ServerSocket对象,指定监听的端口号ServerSocket serverSocket = new ServerSocket(45442);System.out.println("等待客户端连接...");// 监听客户端的连接请求Socket clientSocket = serverSocket.accept();System.out.println("客户端已连接");// 获取输入流和输出流 输入流和输出流是通过socket对象来进行数据传输的。BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);String message;while (true) {// 读取客户端发送的信息message = in.readLine();if (message.equalsIgnoreCase("exit")) {// 如果接收到终止标志,退出循环break;}System.out.println("收到客户端消息:" + message);// 发送响应给客户端out.println("已收到你的消息:" + message);}// 关闭连接clientSocket.close();serverSocket.close();} catch (IOException e) {e.printStackTrace();}}
}

客户端的工作流程:
【1】创建客户端的socket
【2】向服务器发起连接请求。
【3】与服务端通信,发送一个报文后等待回复,然后再发下一个报文。
【4】不断的重复第3)步,直到全部的数据被发送完。
【5】第4步:关闭socket,释放资源。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;public class Client {public static void main(String[] args) {try {// 创建Socket对象,指定服务端的IP地址和端口号Socket socket = new Socket("127.0.0.1", 45442);// 获取输入流和输出流 输入流和输出流是通过socket对象来进行数据传输的。BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter out = new PrintWriter(socket.getOutputStream(), true);// 从控制台读取用户输入BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));String message;while (true) {System.out.println("请输入要发送的信息(输入 'exit' 退出):");message = reader.readLine();if (message.equalsIgnoreCase("exit")) {// 如果用户输入 'exit',发送终止标志给服务端并退出循环out.println("exit");break;}// 将用户输入的信息发送给服务端out.println(message);// 接收服务端的响应并打印String response = in.readLine();System.out.println("服务端响应:" + response);}// 关闭连接socket.close();} catch (IOException e) {e.printStackTrace();}}
}

测试数据:

请输入要发送的信息(输入 'exit' 退出):
Hello Word
服务端响应:已收到你的消息:Hello Word

在运行程序之前,必须保证服务器的防火墙已经开通了网络访问策略

socket是系统资源,操作系统打开的socket数量是有限的,在程序退出之前必须关闭已打开的socket,就像关闭文件指针一样,就像delete已分配的内存一样,极其重要。

UDP链接

使用UDP通信,使用java.net.DatagramSocket创建了一个DatagramSocket对象。

【1】服务端

package socket.UDP;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;public class UDPClient {public static void main(String[] args) {try {// 创建DatagramSocket对象DatagramSocket socket = new DatagramSocket();InetAddress serverAddress = InetAddress.getByName("127.0.0.1");int serverPort = 45442;// 从控制台读取用户输入BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));String message;while (true) {System.out.println("请输入要发送的信息(输入 'exit' 退出):");message = reader.readLine();if (message.equalsIgnoreCase("exit")) {// 如果用户输入 'exit',退出循环break;}byte[] sendData = message.getBytes();// 创建发送数据的DatagramPacket对象DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverAddress, serverPort);// 发送数据socket.send(sendPacket);byte[] receiveData = new byte[1024];// 创建接收数据的DatagramPacket对象DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);// 接收服务端的响应socket.receive(receivePacket);// 将接收到的数据转换为字符串并打印String response = new String(receivePacket.getData(), 0, receivePacket.getLength());System.out.println("服务端响应:" + response);}// 关闭Socket连接socket.close();} catch (IOException e) {e.printStackTrace();}}
}

【2】客户端

package socket.UDP;import java.io.IOException;
import java.net.*;public class UDPServer {public static void main(String[] args) {try {// 创建DatagramSocket对象,并指定监听的端口号DatagramSocket socket = new DatagramSocket(45442);System.out.println("等待客户端连接...");byte[] receiveData = new byte[1024];while (true) {// 创建接收数据的DatagramPacket对象DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);// 接收客户端发送的数据socket.receive(receivePacket);// 获取客户端的IP地址和端口号InetAddress clientAddress = receivePacket.getAddress();int clientPort = receivePacket.getPort();// 将接收到的数据转换为字符串String message = new String(receivePacket.getData(), 0, receivePacket.getLength());System.out.println("收到客户端消息:" + message);if (message.equalsIgnoreCase("exit")) {// 如果接收到终止标志,退出循环break;}// 构造发送数据的字节数组String response = "已收到你的消息:" + message;byte[] sendData = response.getBytes();// 创建发送数据的DatagramPacket对象DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, clientAddress, clientPort);// 发送响应给客户端socket.send(sendPacket);}// 关闭Socket连接socket.close();} catch (IOException e) {e.printStackTrace();}}
}  

测试数据:

请输入要发送的信息(输入 'exit' 退出):
UPD Test
服务端响应:已收到你的消息:UPD Test

相关文章:

Socket通信

优质博文IT-BLOG-CN 一、简介 Socket套接字:描述了计算机的IP地址和端口,运行在计算机中的程序之间采用socket进行数据通信。通信的两端都有socket,它是一个通道,数据在两个socket之间进行传输。socket把复杂的TCP/IP协议族隐藏在…...

TCP 如何保证有效传输及拥塞控制

TCP(传输控制协议)可以通过以下机制保证有效传输和拥塞控制: 确认机制:TCP使用确认机制来保证数据的有效传输。发送方在发送数据的同时还会发送一个确认请求,接收方收到数据后会回复确认响应。如果发送方没有收到确认响…...

PyQt5+Qt设计师初探

在上一篇文章中我们搭建好了PyQt5的开发环境,打铁到趁热我们基于搭建好的环境来简单实战一把 一:PyQt5包模块简介 PyQt5包括的主要模块如下。 QtCore模块——涵盖了包的核心的非GUI功能,此模块被用于处理程序中涉及的时间、文件、目录、数…...

rust cargo

一、cargo是什么 Cargo是Rust的构建工具和包管理器。 Cargo除了创建工程、构建工程、运行工程等功能,还具有下载依赖库、编译依赖等功能。 真正编写程序时,我们不直接用rustc,而是用cargo。 二、使用cargo (一)使用…...

CANoe.Diva生成测试用例

Diva目录 一、CANoe.Diva打开CDD文件二、导入CDD文件三、ECU Information四、时间参数设置五、选择是否测试功能寻址六、勾选需要测试服务项七、生成测试用例 一、CANoe.Diva打开CDD文件 CANoe.Diva可以通过导入cdd或odx文件,自动生成全面的测试用例。再在CANoe中导…...

openGauss学习笔记-89 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用查询原生编译

文章目录 openGauss学习笔记-89 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用查询原生编译89.1 查询编译:PREPARE语句89.2 运行命令89.3 轻量执行支持的查询89.4 轻量执行不支持的查询89.5 JIT存储过程89.6 MOT JIT诊断89.6.1 mot_jit_detai…...

python获取时间戳

使用 datetime 库获取时间。 获取当前时间: import datetime print(datetime.datetime.now()) . 后面的是微秒,也是一个时间单位,1秒1000000微秒。 转为时间戳: import datetimedate datetime.datetime.now() timestamp date…...

2023年山东省安全员C证证考试题库及山东省安全员C证试题解析

题库来源:安全生产模拟考试一点通公众号小程序 2023年山东省安全员C证证考试题库及山东省安全员C证试题解析是安全生产模拟考试一点通结合(安监局)特种作业人员操作证考试大纲和(质检局)特种设备作业人员上岗证考试大…...

Java中的Unicode字符编码与占用比特位解析

本文将详细介绍Java中Unicode字符编码与占用比特位的相关知识。我们将首先介绍Unicode字符集的基本概念,然后深入探讨Java中Unicode字符的编码方式以及占用比特位的特点。最后,我们将讨论一些特殊字符的编码情况,并给出一些在Java中处理Unico…...

分布式事务-TCC案例分析流程图

防止cancel方法在最后执行出现问题,用户收到提示已经退款成功但是由于cancel过慢或者出现问题(虽然最后会重试成功但是用户体验很差),可以做以下的业务sql模型优化(增加一个冻结金额)。...

究竟是什么样的讲解数组算法的博客让我写了三小时???

版本说明 当前版本号[20231004]。 版本修改说明20231004初版 目录 文章目录 版本说明目录二. 基础数据结构2.1 数组1) 概述2) 动态数组1)插入addlast 方法测试: addlast 方法 add 方法测试:add方法 addlast 方法与 add 方法合并版get 方法测试&#x…...

Day-05 CentOS7.5 安装docker

参考 : Install Docker Engine on CentOS | Docker DocsLearn how to install Docker Engine on CentOS. These instructions cover the different installation methods, how to uninstall, and next steps.https://docs.docker.com/engine/install/centos/ Doc…...

Makefile

目录 Makefile Makefile格式 Makefile函数:foreach和wildcard $(foreach var,list,text) $(wildcard pattern) 完善Makefile Makefile 在Linux中使用make工具来编译程序(特别是大程序),而make工具所执行的动作依赖于Makefil…...

c语言练习77:公因⼦的数⽬

公因⼦的数⽬ 题⽬描述: 给你两个正整数 a 和 b ,返回 a 和 b 的公因⼦的数⽬。 如果 x 可以同时整除 a 和 b ,则认为 x 是 a 和 b 的⼀个公因⼦ 。 • ⽰例 1: 输⼊:a 12, b 6 输出:4 解释&#…...

【C++】C++11——右值引用和移动语义、左值引用和右值引用、右值引用使用场景和意义、完美转发、新的类功能

文章目录 C115.右值引用和移动语义5.1左值引用和右值引用5.2左值引用与右值引用比较5.3右值引用使用场景和意义5.4右值引用引用左值及其一些更深入的使用场景分析5.5完美转发 6.新的类功能 C11 5.右值引用和移动语义 右值引用是C11引入的一个新特性,用于支持移动语义…...

Spring Boot的创建和使用(JavaEE进阶系列2)

目录 前言: 1.什么是Spring Boot?为什么要学习Spring Boot? 2.Spring Boot优点 3.创建Spring Boot项目 3.1准备工作 3.2Spring Boot创建 3.2.1通过idea的方式创建 3.2.2通过网页创建 4.Spring Boot中的配置文件 4.1Spring Boot配置…...

【OLSR路由协议】链路状态路由(OLSR)协议中选择多点中继节点算法研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

双重差分模型(DID)论文写作指南与操作手册

手册链接:双重差分模型(DID)论文写作指南与操作手册https://www.cctalk.com/m/group/90983583?xh_fshareuid60953990 简介: 当前,对于准应届生们来说,毕设季叠加就业季,写作时间显得十分宝贵…...

ping 的工作原理

ping 是一个常用于网络诊断的命令行工具,用于测试两台计算机之间的网络连通性。它的工作原理如下: 发出 ICMP Echo 请求: 当你在终端中运行 ping 命令并指定目标主机的IP地址或域名时,计算机会创建一个特殊的ICMP(In…...

93. 复原 IP 地址

有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 . 分隔。 例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.24…...

CTFHub | 解密MySQL、Redis、MongoDB流量中的隐藏Flag

1. 数据库流量分析入门:为什么需要Wireshark? 当你参加CTF比赛时,经常会遇到需要从数据库流量中寻找Flag的题目。这类题目通常会给你一个抓包文件(pcap格式),里面记录了MySQL、Redis或MongoDB等数据库的网络…...

Cursor Free VIP:突破AI编程助手限制的完整解决方案

Cursor Free VIP:突破AI编程助手限制的完整解决方案 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your trial…...

Minecraft世界修复全攻略:从数据损坏到完整恢复的专业解决方案

Minecraft世界修复全攻略:从数据损坏到完整恢复的专业解决方案 【免费下载链接】Minecraft-Region-Fixer Python script to fix some of the problems of the Minecraft save files (region files, *.mca). 项目地址: https://gitcode.com/gh_mirrors/mi/Minecraf…...

个人开发者如何高效率APP上架安卓应用市场?软著、备案、资质、审核详解大全,一篇文章讲透流程规则!

一、上架前的资质准备 1. 软件著作权登记证书(软著) 软著是证明APP拥有自主知识产权的重要文件,多数应用商店要求上架时提供。申请周期通常为1-2个月,建议提前规划。 2. APP备案 根据工信部要求,APP主办者需要在接…...

手指划过屏幕放大模型界面,环氧树脂层和纤维基体在激光路径下呈现出清晰的物理场分布。突然发现这个双层材料烧蚀模型跑得格外顺畅——看来前几天通宵调参没白费

comsol激光清洗、烧蚀双层材料 表面一层50μm厚度的环氧树脂(可更换成其他材料),基体材料为纤维材料。 添加功率为13W的激光进行清洗或烧蚀 模型非常成功、角度选择很奈斯在COMSOL里建模时有个小细节特别关键:把环氧树脂层的厚度参数设为全局变量。别小看…...

无障碍辅助利器:OpenClaw+GLM-4.7-Flash语音控制电脑实操

无障碍辅助利器:OpenClawGLM-4.7-Flash语音控制电脑实操 1. 为什么我们需要语音控制电脑 去年夏天,我的一位程序员朋友因意外导致手部受伤,暂时失去了正常使用键盘鼠标的能力。看着他艰难地用语音输入法逐字敲代码,我开始思考&a…...

UG/NX二次开发必备:C#和C++项目DLL自动签名与拷贝全攻略(附避坑指南)

UG/NX二次开发实战:C#与C项目DLL签名与部署全流程解析 在工业设计软件领域,Siemens NX(原Unigraphics)的二次开发能力一直是工程师扩展功能、提升效率的重要途径。而DLL文件的数字签名环节,则是确保开发成果能在正版NX…...

Llama-3.2V-11B-cot部署教程:bf16+auto device_map双卡4090显存优化详解

Llama-3.2V-11B-cot部署教程:bf16auto device_map双卡4090显存优化详解 1. 项目概述 Llama-3.2V-11B-cot是基于Meta Llama-3.2V-11B-cot多模态大模型开发的高性能视觉推理工具,专为双卡4090环境深度优化。本教程将详细介绍如何快速部署这一专业级解决方…...

Crawl4AI浏览器配置文件创建与键盘交互处理终极指南:打造个性化爬虫身份

Crawl4AI浏览器配置文件创建与键盘交互处理终极指南:打造个性化爬虫身份 【免费下载链接】crawl4ai 🔥🕷️ Crawl4AI: Open-source LLM Friendly Web Crawler & Scrapper 项目地址: https://gitcode.com/GitHub_Trending/craw/crawl4ai…...

5步掌握抖音音乐批量下载:douyin-downloader高效使用指南

5步掌握抖音音乐批量下载:douyin-downloader高效使用指南 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在数字内容创作的浪潮中,背景音乐已成为视频作品的灵魂元素。然而&#xff0…...