python之socket网络编程

华子目录

  • 引言
  • 什么是`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端

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

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

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

相关文章

flutter 使用三方/自家字体

将字体放入assets/fonts下 在pubspec.yaml文件中flutter下添加如下代码: flutter:fonts:- family: MyCustomFontfonts:- asset: assets/fonts/MyCustomFont.ttf 在flutter Text widget中使用字体 import package:flutter/material.dart;void main() > runApp(…

PyQt 入门教程(3)基础知识 | 3.2、加载资源文件

文章目录 一、加载资源文件1、PyQt5加载资源文件2、PyQt6加载资源文件 一、加载资源文件 常见的资源文件有图像与图标,下面分别介绍下加载资源文件的常用方法 1、PyQt5加载资源文件 2、PyQt6加载资源文件 PyQt6版本暂时没有提供pyrcc工具,下面介绍下在不…

js中map,filter,find,foreach的用法介绍

js中map,filter,find,foreach的用法介绍 在 JavaScript 中,数组提供了一些常用的迭代方法,如 map、filter、find 和 forEach,这些方法允许你对数组中的每个元素进行操作,下面是它们的用法和区别…

抖音解压视频素材宝库

在快节奏的生活中,解压视频成为抖音上的热门内容类型,想要制作出精彩的解压视频,优质素材必不可少。今天,为大家推荐几个超棒的抖音解压视频素材网站,让你的创作之路轻松无忧! 蛙学网 作为国内知名的短视频…

【Canvas与化学】铁元素图标

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>铁元素图标Draft1</title><style type"text/css"…

域渗透AD 示例场景漏洞 Kerberos Bronze Bit 【CVE-2020-17049】漏洞

背景 漏洞原理 漏洞复现 约束性委派攻击绕过 基于资源的约束性委派攻击绕过 漏洞预防和修复 背景 Kerberos Bronze Bit (CVE-2020-17049) 漏洞是国外安全公司 Netspi 安全研究员Jake Karnes 发现的一个Kerberos安全功能绕过漏洞。该漏洞存在的原因在于KDC在确定Kerberos服…

YoloV10改进:Block改进|使用ContextAggregation模块改善C2f模块|即插即用

摘要 在计算机视觉领域&#xff0c;目标检测与实例分割任务一直是研究的热点。YoloV10作为目标检测领域的佼佼者&#xff0c;凭借其出色的性能和效率赢得了广泛的认可。然而&#xff0c;随着技术的不断进步&#xff0c;如何进一步提升YoloV10的性能成为了我们追求的目标。近期…

Java爬虫之使用Selenium WebDriver 爬取数据

这里写自定义目录标题 Selenium WebDriver简介一、安装部署二、Java项目中使用1.引入依赖2.示例代码 三、WebDriver使用说明1.WebDriver定位器2.常用操作3.使用 cookie4.键盘与鼠标操作 Selenium WebDriver简介 Selenium WebDriver 是一种用于自动化测试 Web 应用程序的工具。…

【实战指南】Vue.js 介绍组件数据绑定路由构建高效前端应用

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

ollama + fastgpt+m3e本地部署

ollama fastgptm3e本地部署 开启WSL更新wsl安装ubuntu docker下载修改docker镜像源开启WSL integration 安装fastgpt先创建一个文件夹来放置一些配置文件用命令下载fastgpt配置文件用命令下载docker的部署文件 启动容器M3E下载ollama下载oneapi配置登录oneapi配置ollama渠道配…

聊聊零基础如何开始学习鸿蒙开发技术

鸿蒙系统是一款分布式操作系统&#xff0c;其适用范围非常广泛&#xff0c;从智能手机到家用电器&#xff0c;再到工业设备&#xff0c;都能找到应用场景。特别是在智能家居领域&#xff0c;鸿蒙系统可以实现不同设备之间的无缝连接和协同工作&#xff0c;提供更加智能和便利的…

Flink On kubernetes

Apache Flink 是一个分布式流处理引擎&#xff0c;它提供了丰富且易用的API来处理有状态的流处理应用&#xff0c;并且在支持容错的前提下&#xff0c;高效、大规模的运行此类应用。通过支持事件时间&#xff08;event-time&#xff09;、计算状态&#xff08;state&#xff09…

数据治理为何如此简单?

欢迎来文末免费获取数据治理相关PPT和文档 引言 随着大数据技术的迅速发展&#xff0c;企业积累的数据量呈现爆炸式增长。有效的数据管理已经成为企业提高决策效率、增强竞争优势的重要手段。在这样的背景下&#xff0c;数据治理逐渐成为企业数据管理中不可或缺的一环。它不仅…

Vivado - Aurora 8B/10B IP

目录 1. 简介 2. 设计调试 2.1 Physical Layer 2.2 Link Layer 2.3 Receiver 2.4 IP 接口 2.5 调试过程 2.5.1 Block Design 2.5.2 释放 gt_reset 2.5.3 观察数据 3. 实用技巧 3.1 GT 坐标与布局 3.1.1 选择器件并进行RTL分析 3.1.2 进入平面设计 3.1.3 收发器布…

【二刷hot-100】day1

目录 1.两数之和 2.字母异位词分组 3.字母异位词分组 4.最长连续序列 5.移动零 6.盛最多水的容器 7.三数之和 8.接雨水 1.两数之和 class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer,Integer> mapnew HashMap<>();for (int i0;i<…

LeakCanary

LeakCanary 文章目录 LeakCanary一、内容1. 使用方法2. 工作原理3.工作流程 参考资料 一、内容 LeakCanary 是在 Android 项目中&#xff0c;用于检测内存泄露&#xff0c;优化性能的工具。 1. 使用方法 本文使用版本为 2.5 版本&#xff0c;相比于 2.0 之前的版本&#xff…

嵌入式:Keil的Code、RW、RO、ZI段的解析

相关阅读 嵌入式https://blog.csdn.net/weixin_45791458/category_12768532.html // 例1 int main(void) {HAL_Init(); /* 初始化HAL库 */sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟,72M */delay_init(72); …

[PHP]重复的Notice错误信息

<?php $a []; var_dump($a[name]);执行结果&#xff1a; 原因&#xff1a; display_errors和error_reporting都打开了Notice错误信息

前缀和一>寻找数组的中心下标

1.题目&#xff1a; 2.解析&#xff1a; 如果暴力解法时间复杂度是O(N^2)&#xff0c;定个&#xff0c;i&#xff0c;遍历左边右边&#xff1b; 这里可以优化为前缀和的做法&#xff0c;其实就是个动态规划。 代码&#xff1a; public int pivotIndex(int[] nums) {int n n…

如何利用边缘计算网关进行工厂设备数据采集?天拓四方

边缘计算网关集成了数据采集、处理和传输功能&#xff0c;位于传感器和执行器组成的设备层与云计算平台之间。它能够实时处理和响应本地设备的数据请求&#xff0c;减轻云平台的压力&#xff0c;提高数据处理的速度和效率。同时&#xff0c;边缘计算网关还可以将处理后的数据上…