基于socket实现客户端与服务器之间TCP通信

我们在算法部署时,通常需要进行算法端与其他服务端的通信,要么接受指令、要么是需要上传算法结果;除了我们常用的gRPC、HTTP、MQ等方式,还可以利用TCP来实现可靠通信;本次我们利用socket来展示如何进行两端的TCP通信。

目录

一、概念

二、示例代码

1. 服务端

2. 客户端

3. 实现效果

参考:


一、概念

  1. TCP(传输控制协议)

    • TCP是一种传输层通信协议,位于OSI模型的第四层。
    • 它负责在网络中的两个主机之间提供可靠的、有序的和错误检测功能的数据传输。
    • TCP确保数据包正确无误地从源传送到目的地,如果数据在传输过程中丢失或损坏,TCP会重新发送数据直到接收方正确接收到所有数据。
    • TCP是面向连接的协议,这意味着在数据传输开始之前,必须在两端建立一个连接。
  2. Socket(套接字)

    • 套接字是网络编程中的一个端点,它提供了一种方式,允许设备上的应用程序发送和接收数据。
    • 套接字是TCP/IP网络通信的一个抽象概念,它将网络协议栈封装为一个编程接口,使得开发者可以不必关心底层的网络细节。
    • 在操作系统中,套接字用于实现TCP/IP模型的通信,它们可以基于不同的协议,如TCP、UDP(用户数据报协议)等。
    • 套接字编程通常涉及创建套接字、绑定到一个地址和端口、监听连接(对于服务器)、接受或发起连接(对于客户端)、发送和接收数据,以及关闭连接。

二、示例代码

1. 服务端

实现思路:

  • 创建Socket对象

    • 使用 socket.socket(socket.AF_INET, socket.SOCK_STREAM) 创建一个新的socket对象,用于TCP通信。
  • 绑定主机名和端口号

    • host = '127.0.0.1' 表示服务器监听本地回环地址。
    • port = 9998 指定服务器监听的端口号。
    • server_socket.bind((host, port)) 将socket与主机名和端口号绑定。
  • 监听连接

    • server_socket.listen(5) 开始监听连接,参数5表示允许最多5个客户端连接等待接受。
  • 接受连接

    • 在 while True: 循环中,server_socket.accept() 等待并接受客户端的连接请求,返回一个新的socket对象 client_socket 和客户端地址 addr
  • 接收和发送数据

    • 在另一个 while True: 循环中,client_socket.recv(1024) 接收客户端发送的数据,最大接收1024字节。
    • 如果接收到的数据为空,表示客户端关闭了连接,跳出循环。
    • 否则,将接收到的字符串数据尝试反序列化为字典:json.loads(data.decode('utf-8'))
    • 如果成功,打印接收到的字典数据,并将相同的字典数据序列化回字符串发送给客户端:client_socket.send(json.dumps(received_dict).encode('utf-8'))
    • 如果数据格式错误,捕获 json.JSONDecodeError 异常并打印错误信息。
import socket
import jsondef tcp_server():# 创建socket对象server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 获取本地主机名host = '127.0.0.1'# 设置一个端口号port = 9998# 绑定端口号server_socket.bind((host, port))# 设置最大连接数,超过后排队server_socket.listen(5)# 设置超时时间# server_socket.settimeout(10)  # 10秒超时while True:try:# 建立客户端连接client_socket, addr = server_socket.accept()print("连接地址: %s" % str(addr))while True:try:# 接收小于 1024 字节的数据data = client_socket.recv(1024)if not data:# 如果没有数据,跳出循环breakelse:# 打印接收的数据print("收到数据:", data.decode('utf-8'))# 尝试将接收到的字符串数据反序列化为字典try:received_dict = json.loads(data.decode('utf-8'))print("接收到的字典数据:", received_dict)# 发送响应数据给客户端,这里发送相同的字典client_socket.send(json.dumps(received_dict).encode('utf-8'))except json.JSONDecodeError as e:print("数据格式错误,无法解析为字典:", e)except socket.timeout:print("接收数据超时")breakexcept ConnectionResetError:print("连接被客户端重置")finally:# 关闭连接if client_socket:client_socket.close()if __name__ == '__main__':tcp_server()

2. 客户端

实现思路:

  • 创建Socket对象

    • 同服务器端,使用 socket.socket(socket.AF_INET, socket.SOCK_STREAM) 创建一个新的socket对象。
  • 连接到服务器

    • host = '127.0.0.1' 和 port = 9998 指定服务器的地址和端口号。
    • client_socket.connect((host, port)) 连接到服务器。
  • 发送和接收数据

    • 在 while True: 循环中,通过 input("请输入数据:") 获取用户输入的数据,并发送到服务器:client_socket.send(data.encode('utf-8'))
    • 接收服务器返回的数据:client_socket.recv(1024)
    • 打印来自服务器的数据:print("来自服务器的数据:%s" % data.decode('utf-8'))
    • 如果接收到的数据是 'exit',则跳出循环。
  • 关闭连接

    • 在循环结束后,关闭客户端socket连接。
import socket
import json
import time
from tcp_messaging.api.core.tcp_messaging import TcpClientdef main():# 获取本地主机名host = '127.0.0.1'# 设置服务器的端口号port = 9998client = TcpClient((host, port), name='client1')client.connect()# 创建一个字典send_dict = {'key1': 'value1', 'key2': 'value2'}# 将字典序列化为JSON格式的字符串send_data = json.dumps(send_dict).encode('utf-8')client.send(send_data)time.sleep(1)if client.recv(1024):print("received success!")client.close()if __name__ == '__main__':main()

3. 实现效果

客户端发送的数据及接收的返回数据:

服务端接收的数据:

参考:

https://en.wikipedia.org/wiki/Transmission_Control_Protocol

https://en.wikipedia.org/wiki/Network_socket

TCP(传输控制协议)_百度百科

套接字_百度百科

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SAP SD学习笔记10 - SD出荷传票1 在库转送Order - 补充出荷 详解

上一章学习了受注传票中的不完全Log和Business Partner(取引先机能)的知识。 SAP SD学习笔记09 - 受注传票中的不完全Log 和 Business Partner(取引先机能)-CSDN博客 本章继续学习SD的内容。 - 在库转送Order - 补充出荷 目录 1&#xff0…

HCIP-HarmonyOS Application Developer 习题(九)

(多选) 1、HarmonyOS多窗口交互能力提供了以下哪几种交互方式? A. 全局消息通知 B.平行视界 C.悬浮窗 D.分屏 答案:BCD 分析:系统提供了悬浮窗、分屏、平行视界三种多窗口交互,为用户在大屏幕设备上的多任务并行、便捷的临时任务…

集合框架07:LinkedList使用

1.视频链接:13.14 LinkedList使用_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1zD4y1Q7Fw?spm_id_from333.788.videopod.episodes&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5&p142.LinkedList集合的增删改查操作 package com.yundait.Demo01;im…

CSS @规则(At-rules)系列详解___@charset规则使用方法

CSS 规则(At-rules)系列详解 ___charset规则使用方法 本篇目录: 零、时光宝盒 一、charset规则定义和用法 二、CSS charset语法 三、charset 使用方法例子 1、正确使用方法 2、无效的,错误的使用方法 零、时光宝盒 (https://blog.csd…

Android ViewModel

一问:ViewModel如何保证应用配置变化后能够自动继续存在,其原理是什么,ViewModel的生命周期和谁绑定的? ViewModel 的确能够在应用配置发生变化(例如屏幕旋转)后继续存在,这得益于 Android 系统的 ViewMod…

快速解决urllib3.exceptions.MaxRetryError: HTTPSConnectionPool

正题 使用pip命令查看urllib3版本 pip list发现版本为 1.26.9 urllib3 v1.26.9此时如下报错,无法正常使用(使用了代理) urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(hostxxx.xxxxx.com, port443): Max retries exceeded wit…

神经网络模型的“扩散与进化”思想启迪

在上一篇笔记「上交大全华班复现o1旅程式学习下的深思考」中,其中对于上交大提出的旅程学习即system2慢思考认知范式下对于“多步骤的隐式到显式空间状态映射下的细粒度联合概率分布建模”的描述隐喻为“社会心理学或社会经济学两种不同的长程动态系统慢演化现象”。…

AI+视频监控:EasyCVR安防平台赋能火电制造行业的视频智能管理方案

随着信息技术的飞速发展和智能制造的深入推进,火电制造行业作为国民经济的重要组成部分,正面临着智能化转型的迫切需求。为了提升生产效率、保障设备安全、优化管理流程,火电制造企业迫切需要引入先进的视频监控与人工智能技术。EasyCVR安防监…

如何获取 uni-app 应用发布所需的证书、私钥与配置文件

引言 在开发和发布iOS应用时,开发者常常会面临一系列复杂的证书、私钥密码以及配置文件的管理问题。这些配置不仅影响到应用的开发调试,还决定了应用是否能够顺利通过审核并发布到App Store。对于使用uni-app进行开发的开发者来说,自动生成的…

c++基础知识复习(1)

前期知识准备 1 构造函数 (1)默认构造函数:没有参数传入,也没有在类里面声明 (2)手动定义默认构造函数:没有参数传入,但是在类里面进行了声明 可以在类外实现或者类内实现 以下案…

【最新华为OD机试E卷-支持在线评测】考勤信息(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…

vue3 高德地图标注(飞线,呼吸点)效果

装下这两个 npm 忘了具体命令了&#xff0c;百度一下就行 “loca”: “^1.0.1”, “amap/amap-jsapi-loader”: “^1.0.1”, <template><div id"map" style"width: 100%;height: 100%;"></div> </template><script setup> …

自然语言处理问答系统:技术进展、应用与挑战

自然语言处理&#xff08;NLP&#xff09;问答系统是人工智能领域的一个重要分支&#xff0c;它通过理解和分析用户的提问&#xff0c;从大量的文本数据中提取相关信息&#xff0c;并以自然语言的形式回答用户的问题。随着深度学习技术的发展&#xff0c;尤其是预训练语言模型&…

【unity框架开发12】从零手搓unity存档存储数据持久化系统,实现对存档的创建,获取,保存,加载,删除,缓存,加密,支持多存档

文章目录 前言一、Unity对Json数据的操作方法一、JsonUtility方法二、Newtonsoft 二、持久化的数据路径三、数据加密/解密加密方法解密方法 四、条件编译指令限制仅在编辑器模式下进行加密/解密四、数据持久化管理器1、存档工具类2、一个存档数据3、存档系统数据类4、数据存档存…

访问控制列表(课内实验)

实验2&#xff1a;访问控制列表 实验目的及要求&#xff1a; 通过实验&#xff0c;进一步的理解标准ACL与扩展ACL的工作原理及执行过程。理解通配符的概念&#xff0c;熟练掌握标准ACL与扩展ACL的配置指令&#xff0c;掌握将访问控制列表应用VTY线路上&#xff0c;并且能够判断…

【基于ARM深入分析C程序】1--ARM架构与汇编、分析C语句`a++`的执行过程

【基于ARM深入分析C程序】1–ARM架构与汇编、分析C语句a的执行过程 文章目录 【基于ARM深入分析C程序】1--ARM架构与汇编、分析C语句a的执行过程一、3个操作指令二、CPU是怎么知道执行这三条操作指令的&#xff1f;2.1 CPU的架构 2.2 寄存器 本文作为学习笔记&#xff0c;围绕的…

【Next.js 入门教程系列】09-优化技巧

原文链接 CSDN 的排版/样式可能有问题&#xff0c;去我的博客查看原文系列吧&#xff0c;觉得有用的话&#xff0c; 给我的库点个star&#xff0c;关注一下吧 上一篇【Next.js 入门教程系列】08-发送邮件 优化技巧 本篇包括以下内容: Optimizing imagesUsing third-party JS…

正点原子学习笔记之汇编LED驱动实验

1 汇编LED原理分析 为什么要写汇编     需要用汇编初始化一些SOC外设     使用汇编初始化DDR、I.MX6U不需要     设置sp指针&#xff0c;一般指向DDR&#xff0c;设置好C语言运行环境 1.1 LED硬件分析 可以看到LED灯一端接高电平&#xff0c;一端连接了GPIO_3上面…

C# WinForm实现画笔签名及解决MemoryBmp格式问题

目录 需求 实现效果 开发运行环境 设计实现 界面布局 初始化 画笔绘图 清空画布 导出位图数据 小结 需求 我的文章 《C# 结合JavaScript实现手写板签名并上传到服务器》主要介绍了 web 版的需求实现&#xff0c;本文应项目需求介绍如何通过 C# WinForm 通过画布画笔…

Appium环境搭建、Appium连接真机

文章目录 一、安装Android SDK二、安装Appium-desktop三、安装Appium Inspector 一、安装Android SDK 首先需要安装jdk&#xff0c;这里就不演示安装jdk的过程了 SDK下载地址&#xff1a;Android SDK 下载 1、点击 Android SDK 下载 -> SKD Tools 2、选择对应的版本进行下…