【Python】Socket的简单应用

article/2025/10/7 6:48:16

前言

今天“出差在外”,晚上又琐事缠身,实在也没办法特别沉下心去学什么内容,但还是不希望一天一篇的flag就此倒下,只能多多参考别人的博客浅浅学习一下python的socket应用,后续课内做实验了,学习更深入的知识后,我会再补上自己的理解。

(11.4)已更新


Socket 

任何应用,比如浏览网页、刷抖音、微信聊天等等都是通过TCP/IP进行通讯的。

Socket是TCP/IP协议的一组封装,可以理解为是双方通信的接口

Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。

socket在哪里

就好似收发快递,收件人和寄件人并不需要知道中间快递是怎么传输的,只需要在意快递有没有发出去,有没有收到。中间具体的快递运输流程则是快递公司进行管理的。

对应到信息传输,Socket就相当于快递公司,起到一个中间承接的作用。

 目前的socket编程,使用的最多的是通过tcp协议进行网络通讯的。

常见的套接字对象方法和属性

名 称描 述
服务端服务器套接字方法
s.bind(ADDR)将地址(主机名、端口号对)绑定到套接字上
s.listen([backlog])设置并启动 TCP 监听器,如果指定backlog,则必须至少为0(如果低于0,则设置为0);
s.accept()被动接受 TCP 客户端连接,一直等待直到连接到达(阻塞)
客户端客户端套接字方法
s.connect()主动发起 TCP 服务器连接
s.connect_ex()connect()的扩展版本,此时会以错误码的形式返回问题,而不是抛出一个异常
普通通用普通的套接字方法
s.recv()接收 TCP 消息
s.recv_into()接收 TCP 消息到指定的缓冲区
s.send()发送 TCP 消息
s.sendall()完整地发送 TCP 消息
s.recvfrom()接收 UDP 消息
s.recvfrom_into()接收 UDP 消息到指定的缓冲区
s.sendto()发送 UDP 消息
s.getpeername()连接到套接字(TCP)的远程地址
s.getsockname()当前套接字的地址
s.getsockopt()返回给定套接字选项的值
s.setsockopt()设置给定套接字选项的值
s.shutdown()关闭连接
s.close()关闭套接字
s.detach()在未关闭文件描述符的情况下关闭套接字,返回文件描述符
s.ioctl()控制套接字的模式(仅支持 Windows)
阻塞面向阻塞的套接字方法
s.setblocking()设置套接字的阻塞或非阻塞模式
s.settimeout()设置阻塞套接字操作的超时时间
s.gettimeout()获取阻塞套接字操作的超时时间
文件方法面向文件的套接字方法
s.fileno()套接字的文件描述符
s.makefile()创建与套接字关联的文件对象
属性数据属性
s.family套接字家族
s.type套接字类型
s.proto套接字协议

 C/S 双方通信流程

服务器端的基本流程:

1.初始化socket()

2.使用bind()绑定ip和端口号

3使用listen()监听消息

4.获取客户端的套接字地址accept()

5.使用recv()接收数据,send()发送数据与客户端进行交互

客户端的基本流程:

1.初始化socket()

2.使用ip和端口号connect()连接服务器

3.使用recv()接收数据,send()发送数据与服务器进行交互
 

tcp三次握手为例:

服务端S进行socket.listen()时向服务端发起连接请求,第一次握手

客户端C进行socket.connect()时是客户端向服务端发送第一个报文的时候,第二次握手

服务端S进行socket.accpet()服务端响应,第三次握手

连接成功

代码演示

ps:UDP的端口好像只能使用一次

server.py

import socket #导入socket库
from time import ctime
import json
import time
HOST = ''
PORT = 9001
ADDR = (HOST, PORT)
BUFFSIZE = 1024 #定义一次从socket缓冲区最多读入1024个字节
MAX_LISTEN = 5 #表示最多能接受的等待连接的客户端的个数def tcpServer():# TCP服务# with socket.socket() as s:with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:#AF_INET表示socket网络层使用IP协议,SOCK_STREAM表示socket传输层使用tcp协议# 绑定服务器地址和端口s.bind(ADDR)# 启动服务监听s.listen(MAX_LISTEN)print('等待用户接入……')while True:# 等待客户端连接请求,获取connSockconn, addr = s.accept()print('警告,远端客户:{} 接入系统!!!'.format(addr))# with conn:while True:print('接收请求信息……')# 接收请求信息data = conn.recv(BUFFSIZE) #读取的数据一定是bytes类型,需要解码成字符串类型if not data:breakinfo = data.decode()# print('data=%s' % data)print(f'接收数据:{info}')# 发送请求数据conn.send(f'服务端接收到信息{info}'.encode())print('发送返回完毕!!!')conn.close()s.close()# 创建UDP服务
def udpServer():# 创建UPD服务端套接字with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:# 绑定地址和端口s.bind(ADDR)# 等待接收信息while True:print('UDP服务启动,准备接收数据……')# 接收数据和客户端请求地址data, address = s.recvfrom(BUFFSIZE)if not data:breakinfo = data.decode()print(f'接收请求信息:{info}')s.sendto(b'i am udp,i got it', address)s.close()if __name__ == '__main__':while True:choice = input('input choice t-tcp or u-udp:')if choice != 't' and choice != 'u':print('please input t or u,ok?')continueif choice == 't':print('execute tcpsever')tcpServer()else:print('execute udpsever')udpServer()

client.py

import socketfrom time import ctime
HOST = 'localhost'
PORT = 9001
ADDR = (HOST, PORT)
BUFFSIZE = 1024def tcpClient():# 创建客户套接字with socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM) as s:# 尝试连接服务器s.connect(ADDR)print('连接服务成功!!')# 通信循环while True:inData = input('pleace input something:')if inData == 'q':break# 发送数据到服务器# inData = '[{}]:{}'.format(ctime(), inData)s.send(inData.encode())print('发送成功!')# 接收返回数据outData = s.recv(BUFFSIZE)print(f'返回数据信息:{outData}')# 关闭客户端套接字s.close()def udpClient():# 创建客户端套接字with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:while True:# 发送信息到服务器data = input('please input message to server or input \'quit\':')if data == 'quit':breakdata = '[{}]:{}'.format(ctime(), data)s.sendto(data.encode('utf-8'), ADDR)print('send success')# 接收服务端返回信息recvData, addrs = s.recvfrom(BUFFSIZE)info = recvData.decode()print(f'recv message : {info}')# 关闭套接字s.close()if __name__ == '__main__':while True:choice = input('input choice t-tcp or u-udp or q-quit:')if choice == 'q':breakif choice != 't' and choice != 'u':print('please input t or u,ok?')continueif choice == 't':print('execute tcpsever')tcpClient()else:print('execute udpsever')udpClient()

可以在windows命令行界面输入命令检测端口是否被占用:netstat -an|find /i "端口号" 

可以看到9001是没有被占用的 

当运行server.py后

参考:

Python socket详解_Python 学习者的博客-CSDN博客_python socketSocket编程1.基本概念1.什么是客户端/服务器架构?服务器就是一系列硬件或软件,为一个或多个客户端(服务的用户)提供所需的“服务”。它存在唯一目的就是等待客户端的请求,并响应它们(提供服务),然后等待更多请求。说白了就是一个提供服务,一个请求服务得到相应的一个过程。2.套接字:通信端点套接字是计算机网络数据结构,它体现了上节中描述的“通信端点”的概念。在任何类型的通信开始之前,...https://blog.csdn.net/sinat_38682860/article/details/100039701


http://chatgpt.dhexx.cn/article/r7Ov8pRI.shtml

相关文章

http和socket关系

一、先说下HTTP网络协议栈 二、连接过程 三、重点来了,TCP套接字编程,也就是所谓的socket 四、通过比较发现http和socket完全是两个不同的概念,http是应用层的,socket是传输层和网络层的,http要基于socket实现。httpcl…

SOCKET函数详解

socket原理 1.socket socket位于应用层和TCP/IP协议通信中间,抽象成一组接口 1.服务端首先初始化Socket(),然后和接口进行绑定bind()和监听listen(),然后调用accept()进行阻塞。 2.客户端初始化socket(),然后调用connect()与服务端进行连接…

用大白话解释什么是Socket

好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 前言 我在去年就学习过Java中Socket的使用,但对于Socket的理解一直都是迷迷糊糊…

Socket详解

“一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket。 ——有感于实际编程和开源项目研究。 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时&#xff…

Java socket详解

整理和总结了一下经常遇到的问题: 1. 客户端socket发送消息后,为什么服务端socket没有收到? 2. 使用while 循环实现连续输入,是不是就是多线程模式? 3. 对多线程处理机制不是很明白,希望详细讲解…

Socket的详细介绍

文章目录 前言1-Socket出现的原因1.1-Socket出现的背景1.2-Socket解决的问题 2-Socket的组成及关键点2.1-What:什么是Socket?2.2-How: Socket通信实现的步骤2.3-How: Socket编写流程 3-Socket的关键实现3.1-socket()函数创建套接字…

Socket到底是什么?

学习java网络编程一段时间后,突然被问到socket是什么?回答不上来,感觉很尴尬,于是赶紧是查阅资料。 网络由下往上分为 物理层 、数据链路层 、 网络层 、 传输层 、 会话层 、 表现层 和 应用层。 通过初步了解,我知道…

什么是Socket?

一、什么是Socket? 在计算机通信领域,socket 被翻译为“套接字”(套接字主机端口号),它是计算机之间进行通信的一种约定或一种方式。通过 socket这种约定,一台计算机可以接收其他计算机的数据,也…

Socket的学习(一)什么是Socket?

本文参考的是《Socket通信原理》https://www.cnblogs.com/wangcq/p/3520400.html 一、TCP/IP UDP是什么? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集&#xff0c…

整数划分(递归方法)

最近讲到了递归,老师布置了一道经典的整数划分问题,浏览了网上很多代码,还是似懂非懂,想找张清晰地展现递归过程的图片也没有,今天想了想,自己画了一张才发现,想完整清晰地表现这个过程确实真的…

递归算法--整数划分

何为整数划分: 所谓整数划分,是指把一个正整数n写成为 其中, 为正整数,并且 ; 为n的一个划分。 如果 中的最大值不超过m,即 ,则称它属于n的一个m划分。 例如:6的划分: 6…

递归实现整数划分

递归思想 递归是算法设计中的一种基本而重要的算法。递归方法通过函数调用自身将问题转化为本质相同但规模较小的子问题,是分治策略的具体体现。 不多废话,直接上故事 ->从前有座山,山上有座庙,庙里有个老和尚在给小和尚讲故…

复杂的整数划分

复杂的整数划分 又到了动态规划的时间了! 记得我之前讲过的三要素哦 下面这一条题目其实思路并不是非常的难,但是在细节处理上要非常仔细,而且它有3个相互独立的动态规划问题。 总时间限制: 200ms 内存限制: 65536kB 描述 将正整数n 表…

整数划分(DP)

一个正整数 n 可以表示成若干个正整数之和,形如:nn1n2…nk,其中 n1≥n2≥…≥nk,k≥1。 我们将这样的一种表示称为正整数 n 的一种划分。 现在给定一个正整数 n,请你求出 n 共有多少种不同的划分方法。 输入格式 共一行&#x…

【算法】整数划分问题

描述 整数划分问题是算法中的一个经典命题之一。把一个正整数n表示成一系列正整数之和: 正整数n的这种表示称为正整数n的划分。正整数n的不同划分个数称为正整数n的划分数,记作P(n) 。 正整数6有如下11种不同的划分,所以P(6)11。 6 51 42, …

【递归】整数划分(C++)

一、什么是整数划分 所谓整数划分,是指把一个正整数n写成如下形式: n m 1 m 2 ⋅ ⋅ ⋅ m i nm_1m_2m_i nm1​m2​⋅⋅⋅mi​; 其中 m i m_i mi​为正整数,并且 1 ≤ m i ≤ n 1 \leq m_i \leq n 1≤mi​≤n,则 { …

整数划分问题的递归解决(详解)

整数划分问题 这个问题在网上其实有好多博客、文章,本人认为讲的都稍有粗略,这篇文章是个人写的认为稍微详细一点的!! 将正整数n表示为一系列正整数之和, nn1n2n3n4......nk (其中,n1>n2&…

整数划分算法

整数划分问题 问题阐述 将正整数n表示成一系列正整数之和:nn1n2…nk, 其中n1≥n2≥…≥nk≥1,k≥1。 正整数n的这种表示称为正整数n的划分。 输入:一个正整数n 输出:n不同划分个数以及n的划分结果。 问题实例 …

整数划分总结

博客原地址:https://blog.csdn.net/dacc123/article/details/50664738 整数划分问题: 笼统上说就是将一个整数划分成若干个整数之和的方案数。整数划分有很多不同的问法,也有比较隐晦的问法。比如n个苹果放到m个盘子里,比如n个砖块…

整数划分问题(分治算法经典)

题目描述: 整数划分问题是将一个正整数n拆成一组数连加并等于n的形式,且这组数中的最大加数不大于n。 即:nn1n2…nk; n1>n2>n3…>nk 如整数的6划分为: 6 5 1 4 2, 4 1 1 3 3, 3 2 1, 3 1 1 1 2 2 2, 2 2 1 1, 2 1 …