socket库:Python实现TCP/IP客户和服务器通信

简介: socket库:Python实现TCP/IP客户和服务器通信

前言


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


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


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


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


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


服务器

服务器的原理如下:


1.首先创建一个套接字,TCP是面向流的套接字。故需要使用SOCK_STREAM

2.然后使用bind()函数将套接字与服务器地址关联(因为我们只是在本地测试,直接将地址设置为127.0.0.1或者localhost,端口号为10000),当然你身边如果有2台电脑设备,可以直接替换局域网的IP地址4调用listen()函数将套接字设置为服务器模式,然后无限3.等待,参数为最大排队数

4.在循环中,调用accept()等待客户端的消息连接。如果有客户端进行连接,那么accept()函数会返回一个打开的连接与客户端地址

5.指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据

6.通过sendall()进行回传客户端数据

7.传回数据后,与当前的客户端通信就算完成了。需要使用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()


客户端

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


1.创建一个套接字

2.使用connect()函数连接到服务器

3.通过sendall()向服务器发送数据

4.通过recv()接受服务器传递回的数据

5.交互完成之后,使用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库(点击跳转查看)。

相关文章
|
1天前
|
缓存 网络协议 Java
【JavaEE】——TCP回显服务器(万字长文超详细)
ServerSocket类,Socket类,PrintWriter缓冲区问题,Socket文件释放问题,多线程问题
|
2月前
|
域名解析 网络协议 数据库
TCP/IP服务器
【10月更文挑战第20天】TCP/IP服务器
129 65
|
13天前
|
弹性计算 安全 开发工具
灵码评测-阿里云提供的ECS python3 sdk做安全组管理
批量变更阿里云ECS安全组策略(批量变更)
|
1月前
|
缓存 监控 Linux
Python 实时获取Linux服务器信息
Python 实时获取Linux服务器信息
|
2月前
|
Python
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
173 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
|
2月前
|
JSON 数据格式 Python
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
本文介绍了如何使用Python的socket模块实现客户端到服务器端的文件传输,包括客户端发送文件信息和内容,服务器端接收并保存文件的完整过程。
184 1
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
|
2月前
|
IDE 网络安全 开发工具
IDE之pycharm:专业版本连接远程服务器代码,并配置远程python环境解释器(亲测OK)。
本文介绍了如何在PyCharm专业版中连接远程服务器并配置远程Python环境解释器,以便在服务器上运行代码。
476 0
IDE之pycharm:专业版本连接远程服务器代码,并配置远程python环境解释器(亲测OK)。
|
7月前
|
存储 Python
Python网络编程基础(Socket编程)UDP客户端编程
【4月更文挑战第9天】在UDP通信中,客户端负责发送数据到服务器,并接收来自服务器的响应。与服务器不同,客户端通常不需要绑定到特定的地址和端口,因为它可以临时使用任何可用的端口来发送数据。下面,我们将详细讲解UDP客户端编程的基本步骤。
|
7月前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
7月前
|
网络协议 安全 开发者
Python 中的 Socket 编程
Python 中的 Socket 编程
96 4