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 tqdmserver=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 structclient=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

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

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

相关文章

Google DeepMind推出大模型 Gemini (vs GPT4):规模最大、能力最强的人工智能模型

系列文章目录 文章目录 系列文章目录前言谷歌和 Alphabet 首席执行官桑达尔-皮查伊&#xff08;Sundar Pichai&#xff09;的说明一、Gemini 介绍二 、最先进的性能三、新一代功能四、复杂的推理能力五、理解文本、图像、音频及其他内容六、先进的编码技术七、更可靠、可扩展、…

解决:IndentationError:unindent does not match any outer indentation level

解决&#xff1a;IndentationError:unindent does not match any outer indentation level 文章目录 解决&#xff1a;IndentationError:unindent does not match any outer indentation level背景报错问题报错翻译报错位置代码报错原因解决方法今天的分享就到此结束了 背景 在…

谷达冠楠:现在做抖音电商到底怎么样

随着互联网的发展&#xff0c;电商行业也在不断地壮大。而近年来&#xff0c;抖音作为一款短视频社交平台&#xff0c;也逐渐成为了电商的新兴渠道。那么&#xff0c;现在做抖音电商到底怎么样呢? 首先&#xff0c;抖音拥有庞大的用户群体。根据数据显示&#xff0c;抖音的日活…

如何搭建自动化测试框架?8年测试老司机浅谈一下!

公司使用pythonseleniumpytest来做UI自动化测试&#xff0c;我经历了从0开始搭建自动化工程、开发测试报告web服务、编写测试用例&#xff0c;经过了一段时间的磨合&#xff0c;感觉已经比较顺手了&#xff0c;这里梳理下我采用的自动化工程目录组织结构。 整体目录结构及说明…

Selenium无头模式容易遇到的坑

在无头模式下&#xff0c;我们看不到浏览器的操作&#xff0c;但是selenium无头模式的浏览器向服务器发送的请求头和正常模式下还是有点区别的&#xff0c;这就导致了一些网站会检测到我们是用selenium来访问的&#xff0c;从而导致一些问题 下面就是我在使用selenium无头模式时…

MySQL 数据库如何实现 XA 规范?

本文我们来讨论 MySQL 的 XA 规范有哪些应用相关的内容。 MySQL 为我们提供了分布式事务解决方案&#xff0c;在前面的内容中提到过 binlog 的同步&#xff0c;其实是 MySQL XA 规范的一个应用&#xff0c;那么 XA 规范是如何定义的&#xff0c;具体又是如何应用的呢&#xff…

echarts双折线图

引用 //反应时长 durationCharts categoryCommonChart(studyBehavior.durationCharts, durationCharts) function categoryCommonChart(odata, dom){var myChart echarts.init(document.getElementById(dom));let oarr []oarr odata.series.map(function(item){let color…

QML与C++之间自定义对象输出

1.定义暴露的C类 Message.h #ifndef MESSAGE_H #define MESSAGE_H#include "QObject" #include "MessageAuthor.h"class Message : public QObject {Q_OBJECTQ_PROPERTY(MessageAuthor* author READ author )public:explicit Message(QObject *parent nu…

短视频账号矩阵系统开发源头

随着经济的高速的发展&#xff0c;越来越多的人进入短视频领域&#xff0c;都想抓住这个流量风口&#xff0c;现如今&#xff0c;短视频领域竞争加剧&#xff0c;为了满足用户对创新、多样化和高质量内容的需求&#xff0c;新版短视频矩阵运营系统应运而生。抖去推系统4.0新版&…

MySQL 忘记root密码后重置密码操作

在忘记 MySQL 密码的情况下&#xff0c;可以通过 --skip-grant-tables 关闭服务器的认证&#xff0c;然后重置 root 的密码&#xff0c;具体操作步骤如下。 步骤 1)&#xff1a;关闭正在运行的 MySQL 服务。打开 cmd 进入 MySQL 的 bin 目录。 步骤 2)&#xff1a;输入mysqld -…

CANBeded——诊断自动生成代码

目录 一、如何自动生成代码 二、借鉴之处 一、如何自动生成代码 准备&#xff1a; .gny——geny工程 .dbc——CAN 信号矩阵 .cdd——诊断文件 .cfg文件——工程文件宏定义 1.1 打开gny文件 1.2 导入dbc文件 根据dbc文件更新can消息 channel0,configurable options,Acceptan…

java一对一聊天

我们首先要完成服务端&#xff0c;不然出错&#xff0c;运行也要先运行服务端&#xff0c;如果不先连接服务端&#xff0c;就不监听&#xff0c;那客户端不知道连接谁 服务端 import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.Actio…