socket 套接字

1、套接字介绍

        socket起源于Unix,遵循“一切皆文件”出发点,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。

        在设计模式中,Socket把复杂的TCP/IP协议族隐藏在Socket接口后面,Socket去组织数据,以符合指定的协议。Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。

2、套接字服务过程(TCP协议)

3、一个简单服务器示例

       s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)        
· 协议族,通常为AF_INET,表示互联网协议族(TCP/IP协议族)。
· socket类型:SOCK_STREAM,流式套接字提供可靠的、面向连接的通信流:它使用TCP协议,从而保证了数据传输的正确性和顺序性(TCP:可靠的、重传、有连接的,一般用于控制命令)。

 3.1 server  

        s.listen()    0成功,-1失败
· 服务器端套接字一直处于监听状态,不受客户端连接的影响。
· 接收到客户端套接字的连接请求,就会响应客户端套接字的请求,建立一个新的线程,并把服务器端套接字的描述发送给客户端。

        s.accept()  
· 返回新的socket,用于完成和本次接受的客户端通信。从已完成连接的列表,返回连接;没有连接,线程则进入阻塞睡眠状态。

import socket
import struct
import json
from tqdm import tqdm

server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
serversocketaddr=('127.0.0.1',12345)
server.bind(serversocketaddr)
server.listen(1024)

clientsocket,addr=server.accept()
print("Connection from %s has been established!" % clientsocket)

# recv多条数据出现粘包现象,可通过增加header解决,规定内容长度,获取指定内容
print("--------------BEGIN-----------------")
header_len_bytes=clientsocket.recv(4)   # 接收报头长度,固定4字节
header_len=struct.unpack("i",header_len_bytes)[0]
header=clientsocket.recv(header_len).decode()
header=json.loads(header)
file_size=header["file_size"]
file_data=clientsocket.recv(file_size)

print("[{}]{}".format(type(file_data),file_data))
print("--------------END-----------------","\n")
server.close()

  3.2 client

import socket
import os.path
import json
import struct

client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
serversocketaddr=('127.0.0.1',12345)
client.connect(serversocketaddr)

file_name="/Users/test/client.png"
file_size=os.path.getsize(file_name)
with open(file_name,'rb') as file:
    file_data=file.read()
    header = {"file_size": file_size,
              "file_name": file_name}
    header_bytes = json.dumps(header).encode()
    header_length = struct.pack("i", len(header_bytes))
    client.send(header_length)
    client.send(header_bytes)
    # client.sendall(file_data)
    client.send(b"<END>")
    client.close()

3.3 data exchange

· 内容以字节码传输(bytes)
· s.send()  发送内容,只支持字节类型.多个数据包存在粘包情况,需要处理。
·  s.sendall()  发送数据,直到所有的数据都发送完成或报错

3.4 RUN(控制台)

· 开始进程
    /usr/local/bin/python3.7 server_file_name    #python运行目录 +运行文件
    /usr/local/bin/python3.7 client_file_name

· 结束进程
    sudo lsof -i :port   # 终端查询当前端口的详情,获取到PID
    kill -9 PID

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

端口复用和重映射

一、端口复用 &#xff08;1&#xff09;端口复用概念 端口复用是将一个I/O赋予多个功能&#xff0c;通过设置I/O的工作模式来切换不同的功能。 STM32有很多的内置外设&#xff0c;这些外设的外部引脚都是与GPIO复用的。也就是说&#xff0c;一个GPIO如果可以复用为内置外设的…

【rabbitMQ】rabbitMQ用户,虚拟机地址(添加,修改,删除操作)

rabbitMQ的下载&#xff0c;安装和配置 https://blog.csdn.net/m0_67930426/article/details/134892759?spm1001.2014.3001.5502 rabbitMQ控制台模拟收发消息 https://blog.csdn.net/m0_67930426/article/details/134904365?spm1001.2014.3001.5502 目录 用户 添加用户…

simulink MATLABFunction模块中实时函数调用函数的使用

样例 function Predyy matlabceshi(input, Time_s) input1 input; Time_s1 Time_s; Predyy ee(input1) mm(Time_s1); end 上面是主要部分&#xff0c;下面是被调用部分 function A ee(input1) A input1 * 100; end function B mm(Time_s1) B Time_s1 * 100; end 模型…

jvm内存分配机制

内存分配机制 1.一般机制 ​ 如果对象在Eden出生并且经过第一次Minor后仍然存活,并且能被survivor容纳的话,将被移动到survivor空间中,并将对象年龄设为1 对象每熬过一次MinnorGC,年龄就增加一岁,当他的年龄增加到一定程度(默认15岁)就会被晋升到老年代 直接进入老年代的情…

sap增强

四代增强 2种显示增强1种隐式增强 隐式增强 光标放在增强点或其中的代码点击修改即可修改代码 显示增强 1.ENHANCEMENT-POINT 在代码修改界面选择空行 光标所在位置 可以创建多个增强实施且激活后都会执行. 2.ENHANCEMENT-SECTION 1,选中程序中空行 2.编辑->创建选项 …

「JavaScript每日一练」系列——提高你的JS技能(第三天)

有什么不懂可以去看我前两天的笔记 https://blog.csdn.net/weixin_70007095/article/details/134905674 目录 有什么不懂可以去看我前两天的笔记 JavaScript 进阶 - 第3天笔记 编程思想 面向过程 面向对象 构造函数 原型对象 constructor 属性 对象原型 原型继承 原型链 JavaSc…

肾精不足,湿浊难去!老中医教你简单1招,藏养肾精、祛寒祛湿!

前言 冬季祛湿养肾精&#xff0c;做好2件事能事半功倍 湿毒是慢病的温床 有「七十二变」的法力 如果我们善于观察大自然&#xff0c;那么就会发现&#xff0c;在阴雨天&#xff0c;尤其在南方的回南天之时&#xff0c;那些隐蔽的草丛或者腐朽的木桩之上&#xff0c;会长出很…

排序算法-选择/堆排序(C语言)

1基本思想&#xff1a; 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的 数据元素排完 。 2 直接选择排序: 在元素集合 array[i]--array[n-1] 中选择关键码最大 ( 小 ) 的数据元素…

AI:99-基于深度学习的飞机故障检测与维修

🚀 本文选自专栏:人工智能领域200例教程专栏 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的核心代码,详细讲解供大家学习,希望可以帮到大家。欢迎订阅支持,正在不断更新…

HarmonyOS应用开发者基础认证考试(稳过)

判断题 ​​​​​​​ 1. Web组件对于所有的网页都可以使用zoom(factor: number)方法进行缩放。错误(False) 2. 每一个自定义组件都有自己的生命周期正确(True) 3. 每调用一次router.pushUrl()方法&#xff0c;默认情况下&#xff0c;页面栈数量会加1&#xff0c;页面栈支持的…

【开源】基于Vue+SpringBoot的固始鹅块销售系统

项目编号&#xff1a; S 060 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S060&#xff0c;文末获取源码。} 项目编号&#xff1a;S060&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 鹅块类型模块2.3 固…

关于对向量检索研究的一些学习资料整理

官方学习资料 主要是的学习资料是&#xff0c; 官方文档 和官方博客。相关文章还是挺多 挺不错的 他们更新也比较及时。有最新的东西 都会更新出来。es scdn官方博客 这里简单列一些&#xff0c;还有一些其他的&#xff0c;大家自己感兴趣去看。 什么是向量数据库 Elasticse…

计算两个结构的乘积

1 * 1 1 1 1 2a1 3a1 计算2a1*3a1&#xff0c;结果应该有6个点&#xff0c;并且33分解为3a13a1&#xff0c;222分解为2a12a12a1. 在6个点的90个结构中&#xff0c;可以被分解为3a13a1的有17个 9 - - - - 1 1 42 - - - 1 1 - 1 - - - 1 - - - …

机器人与3D视觉 Robotics Toolbox Python 二 空间位姿描述

空间位姿描述 二维空间位姿描述 二维空间位姿表示方法 from spatialmath.base import * from spatialmath import * T1 SE2(x3,y3,theta30,unit"deg") trplot2(T1.A,frame"T1",dims[0, 5, 0, 5]) T2transl2(3, 4) trplot2(T2,frame"T2",dims…

龙迅LT9721 MIPIDSI/CSI/HDMI桥接到TYPE-C/DP 支持高达4K30HZ的分辨率

Lontium LT9721 LT9721描述&#xff1a; Lontium LT9721是MIPI/HDMI到DP转换器&#xff0c;内部有C型替代模式开关和PD控制器。 对于MIPI DSI输入&#xff0c;LT9721具有一个单端口MIPI DSI接收器&#xff0c;具有1个时钟通道和4个数据通道&#xff0c;每个数据通道的最大运行频…

Mybatis中的查询操作

单表查询 单表查询在《初始Mybatis》中已经介绍过&#xff0c;这里就不在介绍了。咱们这里只说单表查询中的“like查询”。like查询单独使用#{}报错 <select id"selectByKeyword" resultType"com.example.demo.entity.Userinfo">select * from use…

[完美解决]Accelerate设置单卡训练报错,成功设置单卡训练

报错内容 ValueError: Less than two GPU ids were configured and tried to run on on multiple GPUs. Please ensure at least two are specified for --gpu_ids, or use --gpu_idsall. ValueError:配置了少于两个GPU id&#xff0c;并试图在多个GPU上运行。请确保为——gpu…

ubuntu22.04 显卡驱动最简单的安装方法

1.拉取可选择安装的显卡驱动版本 sudo apt-get purge nvidia* #apt 的 update 和 upgrade 的区别 #apt update 命令只会获得系统上所有包的最新信息&#xff0c;并不会下载或者安装任何一个包。 #apt upgrade 命令来把这些包下载和升级到最新版本。 2.sudo apt update 3.安装…

多线程(进阶二:CAS)

目录 一、CAS的简单介绍 CAS逻辑&#xff08;用伪代码来描述&#xff09; 二、CAS在多线程中简单的使用 三、原子类自增的代码分析 都看到这了&#xff0c;点个赞再走吧&#xff0c;谢谢谢谢谢 一、CAS的简单介绍 CAS的全称&#xff1a;“Compare And Swap”&#xff0c;字…

《PySpark大数据分析实战》图书上线啦

《PySpark大数据分析实战》图书上线啦 《PySpark大数据分析实战》图书上线啦特殊的日子关于创作关于数据关于Spark关于PySpark关于图书/专栏 《PySpark大数据分析实战》图书上线啦 特殊的日子 不知不觉一转眼入驻CSDN已经满一年了&#xff0c;这真是一个充满意义的特殊的日子&…