python Socket无限发送接收数据方式

简介: Socket是指套接字,是对网络中不同主机上的应用进程之间进行双向通信的端点的一种抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。

一、关于Socket

Socket简介

Socket是指套接字,是对网络中不同主机上的应用进程之间进行双向通信的端点的一种抽象。


一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。

Socket的主要类型

Socket主要有三种类型:流套接字、数据报套接字、原始套接字。

  • 流套接字(SOCK_STREAM):采用了TCP协议,用于提供面向连接、可靠的数据传输服务。
  • 数据报套接字(SOCK_DGRAM):采用了UDP协议,提供一种无连接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。
  • 原始套接字(SOCK_RAW):与上面两种套接字的区别在于原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据。


本文中讲的是采用TCP协议,即流套接字。

二、Python的socket模块

Python中进行网络编程的主要是使用socket模块,当然还有高级一点的网络服务模块SocketServer等内容。本文中主要使用的是socket模块。


socket模块中首先需要使用socket()方法创建套接字对象,代码示例如下:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

其中:

  • 第一个参数是代表套接字家族,一般有socket.AF_UNIX、socket.AF_INET、socket.AF_INET6可以选择。AF_UNIX是本机的通信,AF_INET和AF_INET6分别是IPv4和IPv6。
  • 第二个参数是套接字类型,有socket.SOCK_STREAM、socket.SOCK_DGRAM、socket.SOCK_RAW,分别代表套接字的三种类型。

三、Socket服务端和客户端相关函数

服务端使用的函数

函数

描述

s.bind()

绑定地址(host,port)到套接字, 在 AF_INET下,以元组(host,port)的形式表示地址

s.listen()

开始 TCP 监听。参数backlog是指操作系统可以挂起的最大连接数量。该值至少为 1,一般设置为5

s.accept()

被动接受TCP客户端连接,阻塞式等待连接的到来

客户端使用的函数

函数

描述

s.connect()

TCP服务器连接,参数address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。

s.connect_ex()

connect()函数的扩展版本,出错时返回出错码,而不是抛出异常

服务端和客户端都可以使用的函数

函数

描述

s.recv()

接收 TCP 数据,数据以字符串形式返回,bufsize 指定要接收的最大数据量

s.send()

发送 TCP 数据,将参数string 中的数据发送到连接的套接字

s.sendall()

完整发送 TCP 数据。将参数 string 中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回 None,失败则抛出异常。

s.close()

关闭套接字

s.getpeername()

返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)

s.getsockname()

返回套接字自己的地址。通常是一个元组(ipaddr,port)

s.setsockopt()

设置给定套接字选项的值

s.getsockopt()

返回套接字选项的值

s.settimeout()

设置套接字操作的超时期,参数timeout是一个浮点数,单位是秒。值为None表示没有超时期

s.gettimeout()

返回当前超时期的值,单位是秒,如果没有设置超时期,则返回None

s.setblocking()

如果参数flag为0,则将套接字设为非阻塞模式,否则将套接字设为阻塞模式(默认值)。非阻塞模式下,如果调用recv()没有发现任何数据,或send()调用无法立即发送数据,那么将引起socket.error异常

四、服务器端代码

import socket
def socket_server():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    ip = ''   # ip可以是127.0.0.1,也可以为空
    port = 0000   # 端口号
    server_socket.bind((ip, port))
    server_socket.listen(5)
    logger.info('等待连接')
    while True:
        try:
            client_socket, address = server_socket.accept()
            logger.info(address[0] + '已连接')
            while True:
                data = client_socket.recv(1024)   # 接受客户端发来的数据
                if not data:
                    logger.info(address[0] + '断开连接')
                    break
                client_socket.send(data.upper())
                """
                可以使用else与上面的if形成搭配
                自己的任意想要实现的功能
                """
        except ConnectionResetError:
            logger.error(address[0] + '异常断开连接')
            continue
        except KeyboardInterrupt:
            logger.info('服务器关闭')
            break
    server_socket.close()
if __name__ == '__main__':
    socket_server()

五、客户端代码

import socket
def socket_client():
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    ip = ''   # ip可以为127.0.0.1,也可以为服务器的IP,例:10.0.0.xxx
    port = 0000   # 必须与服务器端口号一致
    client_socket.connect((ip, port))
    while True:
        msg = input('>>').strip()
        if not msg:
            continue
        client_socket.send(msg.encode('utf-8'))   # 客户端发送数据
        data = client_socket.recv(1024)   # 接收服务端返回的数据
        print(data.decode("utf-8"))
        # break   无break可以循环发送
    client_socket.close()
if __name__ == '__main__':
    socket_client()


注:客户端和服务端再接收发送数据时,都需要注意数据格式,即decode()和encode()。

相关文章
|
4天前
|
数据挖掘 PyTorch TensorFlow
|
1天前
|
算法 Python
揭秘!Python数据魔术师如何玩转线性回归,让你的预测精准到不可思议
【9月更文挑战第13天】在数据科学领域,线性回归以其优雅而强大的特性,将复杂的数据关系转化为精准的预测模型。本文将揭秘Python数据魔术师如何利用这一统计方法,实现令人惊叹的预测精度。线性回归假设自变量与因变量间存在线性关系,通过拟合直线或超平面进行预测。Python的scikit-learn库提供了简便的LinearRegression类,使模型构建、训练和预测变得简单直接。
11 5
|
2天前
|
网络协议 安全 网络安全
震惊!Python Socket竟能如此玩转网络通信,基础到进阶全攻略!
【9月更文挑战第12天】在网络通信中,Socket编程是连接不同应用与服务的基石。本文通过问答形式,从基础到进阶全面解析Python Socket编程。涵盖Socket的重要性、创建TCP服务器与客户端、处理并发连接及进阶话题如非阻塞Socket、IO多路复用等,帮助读者深入了解并掌握网络通信的核心技术。
16 6
|
3天前
|
存储 算法 测试技术
预见未来?Python线性回归算法:数据中的秘密预言家
【9月更文挑战第11天】在数据的海洋中,线性回归算法犹如智慧的预言家,助我们揭示未知。本案例通过收集房屋面积、距市中心距离等数据,利用Python的pandas和scikit-learn库构建房价预测模型。经过训练与测试,模型展现出较好的预测能力,均方根误差(RMSE)低,帮助房地产投资者做出更明智决策。尽管现实关系复杂多变,线性回归仍提供了有效工具,引领我们在数据世界中自信前行。
17 5
|
3天前
|
机器学习/深度学习 数据挖掘 TensorFlow
🔍揭秘Python数据分析奥秘,TensorFlow助力解锁数据背后的亿万商机
【9月更文挑战第11天】在信息爆炸的时代,数据如沉睡的宝藏,等待发掘。Python以简洁的语法和丰富的库生态成为数据分析的首选,而TensorFlow则为深度学习赋能,助你洞察数据核心,解锁商机。通过Pandas库,我们可以轻松处理结构化数据,进行统计分析和可视化;TensorFlow则能构建复杂的神经网络模型,捕捉非线性关系,提升预测准确性。两者的结合,让你在商业竞争中脱颖而出,把握市场脉搏,释放数据的无限价值。以下是使用Pandas进行简单数据分析的示例:
17 5
|
3天前
|
存储 安全 算法
RSA在手,安全我有!Python加密解密技术,让你的数据密码坚不可摧
【9月更文挑战第11天】在数字化时代,信息安全至关重要。传统的加密方法已难以应对日益复杂的网络攻击。RSA加密算法凭借其强大的安全性和广泛的应用场景,成为保护敏感数据的首选。本文介绍RSA的基本原理及在Python中的实现方法,并探讨其优势与挑战。通过使用PyCryptodome库,我们展示了RSA加密解密的完整流程,帮助读者理解如何利用RSA为数据提供安全保障。
15 5
|
1天前
|
消息中间件 网络协议 网络安全
解锁Python Socket新姿势,进阶篇带你玩转高级网络通信技巧!
【9月更文挑战第13天】在掌握了Python Socket编程基础后,你是否想进一步提升技能?本指南将深入探讨Socket编程精髓,包括从阻塞到非阻塞I/O以提高并发性能,使用`select`进行非阻塞操作示例;通过SSL/TLS加密通信保障数据安全,附带创建SSL服务器的代码实例;以及介绍高级网络协议与框架,如HTTP、WebSocket和ZeroMQ,帮助你简化复杂应用开发。通过学习这些高级技巧,你将在网络编程领域更进一步。
11 2
|
4天前
|
数据采集 数据挖掘 数据处理
使用Python和Pandas处理CSV数据
使用Python和Pandas处理CSV数据
29 5
|
2月前
|
网络协议 开发者 Python
深度探索Python Socket编程:从理论到实践,进阶篇带你领略网络编程的魅力!
【7月更文挑战第25天】在网络编程中, Python Socket编程因灵活性强而广受青睐。本文采用问答形式深入探讨其进阶技巧。**问题一**: Socket编程基于TCP/IP,通过创建Socket对象实现通信,支持客户端和服务器间的数据交换。**问题二**: 提升并发处理能力的方法包括多线程(适用于I/O密集型任务)、多进程(绕过GIL限制)和异步IO(asyncio)。**问题三**: 提供了一个使用asyncio库实现的异步Socket服务器示例,展示如何接收及响应客户端消息。通过这些内容,希望能激发读者对网络编程的兴趣并引导进一步探索。
27 4
|
2月前
|
网络协议 Python
网络世界的建筑师:Python Socket编程基础与进阶,构建你的网络帝国!
【7月更文挑战第26天】在网络的数字宇宙中,Python Socket编程是开启网络世界大门的钥匙。本指南将引领你从基础到实战,成为网络世界的建筑师。
49 2