python之socket网络编程

news2024/10/17 5:21:09

华子目录

  • 引言
  • 什么是`socket`
    • `socket`套接字`类型`
      • `TCP`和`UDP`
  • `socket`服务端核心组件
    • 1.创建`socket`对象
    • 2.绑定`地址`和`端口`
    • 3.监听连接
    • 4.接受连接
    • 5.接受`client端`消息`client_sock.revc(1024)`
    • 6.发送`响应`给`client端`
      • 6.1`client_sock.send()`
      • 6.2`client_sock.sendall()`
    • 7.关闭`client端`连接
    • 8.关闭`server`端连接
  • `socket`客户端核心组件
    • 1.创建`socket`对象
    • 2.连接`server端`
    • 3.发送`请求`给`server端`
      • 3.1`client.send()`
      • 3.2`client.sendall()`
    • 4.接受`server端`响应`client.revc(1024)`
    • 5.关闭`client端`连接
  • 示例
    • 测试

引言

在互联网时代,网络编程已经成为开发人员必备的技能之一。无论是Web开发、实时通信还是分布式计算,都离不开网络编程支持Python提供的socket模块为我们提供了简洁而强大接口,可以轻松实现客户端服务器之间的通信

  • Socket编程网络编程重要部分,主要用于在不同计算机之间进行通信Python提供了一个非常强大socket库,使得网络编程变得简单和灵活。本篇博文将详细介绍Pythonsocket编程,包括基础概念、核心组件、常用功能,并附上一个综合的示例及其运行结果。

什么是socket

  • Socket是网络通信的端点,它允许不同的计算机之间进行数据交换。在 Python 中,socket是通过 socket模块来实现的。Socket通信过程主要包括创建 socket对象绑定地址监听连接发送和接收数据等步骤。

socket套接字类型

Python 中,socket类型主要有以下几种:

  • 流式套接字stream (SOCK_STREAM):提供面向连接的、可靠的字节流服务。常用于TCP协议。
  • 数据报套接字dgram (SOCK_DGRAM):提供无连接的、不可靠的数据报服务。常用于UDP协议。

TCPUDP

  • TCP (Transmission Control Protocol):面向连接的、可靠的协议,适用于需要保证数据准确传输的场景。
  • UDP (User Datagram Protocol):无连接的、不可靠的协议,适用于需要快速传输数据但不要求数据准确到达的场景。

socket服务端核心组件

1.创建socket对象

使用socket.socket()函数可以创建一个 socket对象。该函数的两个参数分别指定了地址族套接字类型

import socket

#创建名为server的一个socket对象
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  • socket.AF_INET:表示使用IPv4地址。
  • socket.SOCK_STREAM:表示套接字类型流式套接字,即TCP

2.绑定地址端口

服务端需要绑定一个 IP地址端口号,使得客户端可以找到并连接到服务器

  • 使用对象名.bind()进行绑定,bind()括号中是一个元组类型
#绑定ip地址和服务的端口号
server.bind(("127.0.0.1", 10086))

3.监听连接

服务器端需要监听来自客户端连接请求

  • 使用对象名.listen()函数进行监听,listen()括号中是一个int类型,表示允许连接的最大连接数
#监听的最大连接数是3
server.listen(3)

4.接受连接

服务器端使用 对象名.accept() 函数接受客户端的连接请求

  • 该函数会发生阻塞,直到有客户端连接
  • 如果有客户端连接了,accept()返回2个值,第一个是client的socket对象,第二个是client的ip地址和端口
#通过接受到的客户端连接,来获取client的socket对象,从而获取client发送过来的消息
client_sock, client_address = server.accept()
  • client_sock是一个客户端socket对象
  • client_address是客户端的地址信息,是一个元组(ip地址, 端口号)

5.接受client端消息client_sock.revc(1024)

  • 使用返回的client_sock对象客户端进行数据交换。可以使用client_sock.recv()方法接收客户端发送的数据,
  • recv()能接受的最大字节数1024个字节,所以recv()括号中填写int类型数字表示字节数,如果接受的字节数大于1024会发生粘包
  • recv()方法在接受数据时会发生阻塞
  • recv()会返回一个编码后数据,所以我们在查看数据的时候,需要进行data.decode("utf-8")进行解码
data = client_sock.recv(1024)
print(data.decode("utf-8"))

6.发送响应client端

6.1client_sock.send()

  • 发送时,需要对数据进行编码,常使用encode("utf-8")对数据进行编码
  • send()可能会发送数据的全部部分。如果缓冲区已满网络状况不佳,它可能只会发送部分数据
  • send()方法返回一个整数,表示实际发送字节数
response = "收到了"
byte_number = client_sock.send(response.encode("utf-8"))
print(byte_number)  #此时byte_number值为9,因为一个汉字在utf-8中占3个字节

6.2client_sock.sendall()

  • 发送时,需要对数据进行编码,常使用encode("utf-8")对数据进行编码
  • 如果由于网络拥塞其他原因数据不能立即发送完毕sendall()继续尝试发送数据,直到所有数据发送完毕
client_sock.sendall("接受到了".encode("utf-8"))

7.关闭client端连接

使用close()函数可以关闭socket连接

client_sock.close()

8.关闭server端连接

使用close()函数可以关闭socket连接

server.close()

socket客户端核心组件

1.创建socket对象

使用socket.socket()函数可以创建一个 socket对象。该函数的两个参数分别指定了地址族套接字类型

import socket

#创建名为client的一个socket对象
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  • socket.AF_INET:表示使用IPv4地址。
  • socket.SOCK_STREAM:表示套接字类型流式套接字,即TCP

2.连接server端

  • client端需要使用 client对象.connect()函数连接到服务端
  • connect()括号中是一个元组类型,第一个参数表示服务端ip,第二个参数表示服务端开发的端口
client.connect(("127.0.0.1", 10086))

3.发送请求server端

3.1client.send()

  • 发送时,需要对数据进行编码,常使用encode("utf-8")对数据进行编码
  • send()可能会发送数据的全部部分。如果缓冲区已满网络状况不佳,它可能只会发送部分数据
  • send()方法返回一个整数,表示实际发送字节数
request = "你好服务端"
byte_number = client.send(request.encode("utf-8"))
print(byte_number)  #此时byte_number值为15,因为一个汉字在utf-8中占3个字节

3.2client.sendall()

  • 发送时,需要对数据进行编码,常使用encode("utf-8")对数据进行编码
  • 如果由于网络拥塞其他原因数据不能立即发送完毕sendall()继续尝试发送数据,直到所有数据发送完毕
client.sendall("你好服务端".encode("utf-8"))

4.接受server端响应client.revc(1024)

  • 使用client对象,可以使用client.recv(1024)方法接收server端响应的数据,
  • recv()能接受的最大字节数1024个字节,所以recv()括号中填写int类型数字表示字节数,如果接受的字节数大于1024会发生粘包
  • recv()方法在接受数据时会发生阻塞
  • recv()会返回一个编码后数据,所以我们在查看数据的时候,需要进行data.decode("utf-8")进行解码
data = client.recv(1024)
print(data.decode("utf-8"))

5.关闭client端连接

使用close()函数可以关闭socket连接

client.close()

示例

server端

import socket


class TCPSERVER:
    def __init__(self, ip, port):
        self.ip = ip
        self.port = port
        self.number = 5  #设置服务端监听个数

    def serverTCP(self):
        server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  #tcp
        server.bind((self.ip, self.port))
        server.listen(self.number)
        client_sock, client_address = server.accept()
        while True:
            try:   #tcp中不允许client先关机,如果先关机,服务端会报错,所以这里使用try异常捕获
                # 接受client消息
                data = client_sock.recv(1024)
                print(data.decode("utf-8"))
                # 响应client
                client_sock.sendall("响应:".encode("utf-8")+data)
            except ConnectionAbortedError:
                break
        client_sock.close()
        server.close()


if __name__ == '__main__':
    s = TCPSERVER("127.0.0.1", 10080)
    s.serverTCP()

client端

import socket


class TCPCLIENT:
    def __init__(self, ip, port):
        self.server_ip = ip
        self.server_port = port

    def clientTCP(self):
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #tcp
        client.connect((self.server_ip, self.server_port))
        while True:
            msg = input(">>(quit退出):").strip()
            if not msg:  #tcp不能发送空白消息
                continue
            if msg == "quit":
                break
            # client端发送数据
            client.sendall(msg.encode("utf-8"))
            # client端接受响应
            data = client.recv(1024)
            print(data.decode("utf-8"))
        client.close()


if __name__ == '__main__':
    c = TCPCLIENT("127.0.0.1", 10080)
    c.clientTCP()

测试

必须先启动server端,再启动client端

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【初阶数据结构】归并排序 - 分而治之的排序魔法

文章目录 前言1. 什么是归并排序?1.1 归并排序的步骤 2. 归并排序的代码实现2.1 归并排序代码的关键部分讲解2.1.1 利用递归2.1.2 将拆解的数组的元素放到一个临时空间中进行重新排序2.1.3 将在临时空间中排好的数组复制到目标数组中 3. 归并排序的非递归写法 前言 …

未来汽车究竟该是什么样子?

24年10月14日,在中国(深圳)机器视觉展暨机器视觉技术及工业应用研讨会上,同行者分享了未来智能座舱应该长什么样子。 受此启发,个人觉得当前大多数新能源车都极力想做出电动感,但是布局传统没跳出来&#…

DAY52WEB 攻防-XSS 跨站反射型存储型DOM 型标签闭合输入输出JS 代码解析

#知识点: 1、XSS跨站-输入输出-原理&分类&闭合 2、XSS跨站-分类测试-反射&存储&DOM 演示案例: ➢XSS跨站-输入输出-原理&分类&闭合 ➢XSS跨站-分类测试-反射&存储&DOM #XSS跨站-输入输出-原理&分类&闭合 漏…

安防监控摄像头图传模组,1公里WiFi无线传输方案,监控新科技

在数字化浪潮汹涌的今天,安防监控领域也迎来了技术革新的春风。今天,我们就来聊聊这一领域的产品——摄像头图传模组,以及它如何借助飞睿智能1公里WiFi无线传输技术,为安防监控带来未有的便利与高效。 一、安防监控的新篇章 随着…

基于Java+Springboot+Vue开发的酒店客房预订管理系统

项目简介 该项目是基于JavaSpringbootVue开发的酒店客房预订管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java…

【AI学习】Mamba学习(七):HiPPO通用框架介绍

HiPPO这篇论文《HiPPO: Recurrent Memory with Optimal Polynomial Projections》,提出了一个通用框架。 我们再重新看一下论文的摘要: 从连续数据中学习的一个核心问题是,随着更多数据的处理,以增量方式表示累积历史。我们介绍了…

【记录】Windows|Windows 修改字体大全(Windows 桌面、VSCode、浏览器)

【记录】Windows|Windows 修改字体大全(Windows 桌面、VSCode、浏览器) 前言 最近从学长那里发现了一款非常美观的衡水体字体——Maple Mono SC NF。您可以通过以下链接下载该字体:https://github.com/subframe7536/maple-font/…

【C语言刷力扣】1832.判断句子是否为全字母句

题目&#xff1a; 法一 bool checkIfPangram(char* sentence) {int str[256];memset(str, 0, sizeof(int));for (int i 0; i < strlen(sentence); i) {str[ sentence[i] ];}for (int j a; j < z; j) {if (!str[j]) return false;}return true; } 法二 动态分配 typ…

C++ operator new和operator delete的深入讲解

个人主页&#xff1a;Jason_from_China-CSDN博客 所属栏目&#xff1a;C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目&#xff1a;C知识点的补充_Jason_from_China的博客-CSDN博客 前言 关于operator new和operator delete我们需要明确一个概念&#xff0c;这两个都是…

2024全新UI网址发布页源码带黑夜模式

源码简介 2024全新UI网址发布页源码带黑夜模式&#xff0c;带网站延迟测速&#xff0c;该源码是html源码&#xff0c;可以做个引导页面。 安装教程 纯HTML&#xff0c;直接将压缩包上传网站目录解压即可(或在本地直接打开) 首页截图 源码下载 2024全新UI网址发布页源码带黑…

​​Vision Pro/空间计算小白体系化练手案例:从入门到精通的实战项目指南

引言 随着苹果Vision Pro的发布,空间计算技术正迎来前所未有的发展机遇。对于希望进入这一领域的开发者来说,掌握visionOS及相关工具链是至关重要的第一步。本文将介绍一系列由浅入深的实战项目,旨在帮助初学者系统地学习并实践visionOS开发。这些项目不仅适合个人学习,也…

踩坑日记:线上接口超时问题排查

1.背景: 上线后,功能测试. 进入小程序页面发现很慢,耗时超过5秒,打开skywalking发现大量接口耗时都很高. 2.top命令 服务器top命令查看cpu资源发现占用并不高 3.mysql查看sql运行情况 # 当前运行的所有事务 select * from information_schema.innodb_trx; 1 | …

国内液压一体式潜孔钻机市场相对分散

根据研究团队调研统计&#xff0c;2023年全球液压一体式潜孔钻机市场销售额达到了52亿元&#xff0c;预计2030年将达到90亿元&#xff0c;年复合增长率&#xff08;CAGR&#xff09;为7.1%&#xff08;2024-2030&#xff09;。中国市场在过去几年变化较快&#xff0c;2023年市场…

计算机网络基础(1)

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络基础 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. 计算机网…

100. UE5 GAS RPG 显示范围魔法的攻击范围

在这一篇里&#xff0c;我们将制作一个范围魔法&#xff0c;释放魔法时&#xff0c;我们将在鼠标拾取位置绘制一个魔法光圈&#xff0c;用于显示技能释放时攻击的范围&#xff0c;然后再次点击可以释放技能。 创建贴花类 魔法范围标识的光圈&#xff0c;我们采用贴花实现&…

AI 代码工具大揭秘:提高编程效率的必备神器!

近年来&#xff0c;人工智能得到了迅猛的发展&#xff0c;并在各行各业都得到了广泛应用。尤其是近两年来&#xff0c;AI开发工具逐渐成为开发者们的新宠&#xff0c;其中GitHub Copilot更是引发了无限可能性的探索。在本文中&#xff0c;我将向大家介绍一些实用性较高的智能开…

徒步1 -经典贪心

# 问题描述 小明想从A徒步到B&#xff0c;总路程需要M天&#xff0c;路程中为了确保安全&#xff0c;小明每天需要消耗1份食物。 在起点及路程当中&#xff0c;零星分布着N个补给站&#xff0c;可以补充食物&#xff0c;不同补给站的食物价格可能不同。 请问小明若要安全完…

求双十一宠物空气净化器推荐!希喂、范罗士、有哈哪款好用?

不知道大家有没有觉得&#xff0c;今年的双十一比以往要冷清些。还是朋友提醒我才知道&#xff0c;预售已经开始几天了&#xff0c;真切的体会到了消费降级带来的变化。不过自己的东西可买可不买&#xff0c;猫主子的口粮和生活用品还是要保证的。 把小猫接回来已经一年了&…

HTTP服务

一.http协议的介绍 http应用层协议 超文本传输协议&#xff08;比如网站上面的超链接&#xff09; 作用&#xff1a;构建网站服务器&#xff0c;可以在客户端与网站服务器之间传输文本数据。 浏览器会将文本数据解析成对应的图片&#xff0c;视频进行展示。 1.网站类型 静…

字符串(4)_字符串相乘_高精度乘法

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 字符串(4)_字符串相乘_高精度乘法 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目…