Python基于socket实现TCP/IP客户和服务器通信

 更新时间:2021年06月07日 10:11:28   作者:一天一篇Python库  
本主要介绍了Python socket网络编程TCP/IP服务器与客户端通信的相关资料,这里对Scoket 进行详解并创建TCP服务器及TCP 客户端实例代码,需要的朋友可以参考下

前言

套接字除了用于分析网络地址等功能之外,还可以配置一个服务器,监听到来的消息。

比如你在网络上跟网络机器人聊天,你发送数据到机器人(服务器),然后机器人(服务器)反馈聊天数据信息给你。

当然,机器人的回复内容可能还涉及机器学习,但简单的消息反馈涉及的就是套接字的知识。

简单的搭建服务器与客户端

既然已经了解了套接字的应用。下面,我们来实现一个简单的单向通信TCP/IP服务器与客户端。

服务器

服务器的原理如下:

  • 首先创建一个套接字,TCP是面向流的套接字。故需要使用SOCK_STREAM
  • 然后使用bind()函数将套接字与服务器地址关联(因为我们只是在本地测试,直接将地址设置为127.0.0.1或者localhost,端口号为10000),当然你身边如果有2台电脑设备,可以直接替换局域网的IP地址
  • 调用listen()函数将套接字设置为服务器模式,然后无限循环等待,参数为最大排队数
  • 在循环中,调用accept()等待客户端的消息连接。如果有客户端进行连接,那么accept()函数会返回一个打开的连接与客户端地址
  • 指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据
  • 通过sendall()进行回传客户端数据
  • 传回数据后,与当前的客户端通信就算完成了。需要使用close()进行关闭清理

示例代码如下:

import socket

# 1.创建一个套接字,
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.使用bind()函数将套接字与服务器地址关联
sock.bind(('localhost', 10000))
# 3.调用listen()函数将套接字设置为服务器模式
sock.listen(1)

while True:
    # 4.调用accept()等待客户端的消息连接
    # 如果有客户端进行连接,那么accept()函数会返回一个打开的连接与客户端地址
    connection, client_address = sock.accept()
    print("连接客户端地址:", client_address)
    try:
        # 5.指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据
        data = connection.recv(1024)
        print(data)
        if data:
            # 6.通过sendall()进行回传客户端数据。
            connection.sendall("已接受到数据".encode())
        else:
            print("客户端没有发送数据,不需要传送数据")
    finally:
        #7.需要使用close()进行关闭清理
        connection.close()

客户端

实现客户端相对来说比服务器要简单的多,因为其不需要监听,只需要连接发送数据即可。客户端实现主要分为:

  • 创建一个套接字
  • 使用connect()函数连接到服务器
  • 通过sendall()向服务器发送数据
  • 通过recv()接受服务器传递回的数据
  • 交互完成之后,使用close()关闭清理

示例如下:

import socket

# 1.创建一个套接字,
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.使用bind()函数将套接字与服务器地址关联
sock.connect(('localhost', 10000))

try:
    msg = b"Are you there?"
    # 3.通过sendall()向服务器发送数据
    sock.sendall(msg)
    # 4.通过recv()接受服务器传递回的数据
    data = sock.recv(1024)
    print(data.decode())
finally:
    # 5.交互完成之后,使用close()关闭清理
    sock.close()

运行之后,服务器与客户端交互效果如下:

服务器数据

客户端数据

create_connection(更简易的客户端)

连接服务器除了使用connect()函数之外,其实还有另一个函数create_connection()来连接服务器,它可以省略几个步骤。示例如下:

import socket

# 获取匹配开头字符串的所有属性值
def getConstants(prefix):
    return {
        getattr(socket, n): n
        for n in dir(socket)
        if n.startswith(prefix)
    }
    
ipproto_str = getConstants("IPPROTO_")
family_str = getConstants("AF_")
type_str = getConstants("SOCK_")

sock = socket.create_connection(('127.0.0.1', 10000))
print(ipproto_str[sock.proto])
print(family_str[sock.family])
print(type_str[sock.type])

try:
    msg = b"Are you there?"
    sock.sendall(msg)
    data = sock.recv(1024)
    print(data.decode())
finally:
    sock.close()

运行之后,效果如下:

客户端

create_connection()函数的原理是使用getaddrinfo()函数查找候选连接的参数,并返回一个打开的socket。getaddrinfo()函数的讲解内容在上一篇socket库(点击跳转查看)。

到此这篇关于Python基于socket实现TCP/IP客户和服务器通信的文章就介绍到这了,更多相关Python TCP/IP客户和服务器通信内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python下对hsv颜色空间进行量化操作

    python下对hsv颜色空间进行量化操作

    这篇文章主要介绍了python下对hsv颜色空间进行量化操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • Pandas的MultiIndex多层索引使用说明

    Pandas的MultiIndex多层索引使用说明

    这篇文章主要介绍了Pandas的MultiIndex多层索引使用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Python3内置模块之json编解码方法小结【推荐】

    Python3内置模块之json编解码方法小结【推荐】

    这篇文章主要介绍了Python3内置模块之json编解码方法小结,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • python中的三种注释方法

    python中的三种注释方法

    这篇文章主要介绍了python中的三种注释方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • LRUCache的实现原理及利用python实现的方法

    LRUCache的实现原理及利用python实现的方法

    LruCache 是 Android 的一个内部类,提供了基于内存实现的缓存,而下面这篇文章主要给大家介绍了关于LRUCache的实现原理以及利用python实现的方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-11-11
  • 举例讲解Python中的身份运算符的使用方法

    举例讲解Python中的身份运算符的使用方法

    这篇文章主要介绍了举例讲解Python中的身份运算符的使用方法,是Python入门学习中的基础知识,需要的朋友可以参考下
    2015-10-10
  • Python queue队列原理与应用案例分析

    Python queue队列原理与应用案例分析

    这篇文章主要介绍了Python queue队列原理与应用,结合具体案例形式分析了Python queue队列的原理、功能、实现方法与使用技巧,需要的朋友可以参考下
    2019-09-09
  • Python使用Flask-SQLAlchemy连接数据库操作示例

    Python使用Flask-SQLAlchemy连接数据库操作示例

    这篇文章主要介绍了Python使用Flask-SQLAlchemy连接数据库操作,简单介绍了flask、Mysql-Python以及Flask-SQLAlchemy的安装方法,并结合实例形式分析了基于Flask-SQLAlchemy的数据库连接相关操作技巧,需要的朋友可以参考下
    2018-08-08
  • Python爬虫框架Scrapy常用命令总结

    Python爬虫框架Scrapy常用命令总结

    这篇文章主要介绍了Python爬虫框架Scrapy常用命令,结合实例形式总结分析了Scrapy框架中常见的全局命令与项目命令功能、使用方法及操作注意事项,需要的朋友可以参考下
    2018-07-07
  • Python代码执行时间测量模块timeit用法解析

    Python代码执行时间测量模块timeit用法解析

    这篇文章主要介绍了Python代码执行时间测量模块timeit用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07

最新评论