Python网络编程之Socket通信简单实现(文末赠书)

Socket是一个TCP/IP网络通讯的抽象层,提供一系列的数据交互操作接口,这样开发者可以不再关注于具体的协议处理细节,从而快速的让自己的程序实现网络数据交互。

简单来说,程序进程之间需要通过socket进行通信,它类似于一个插件,所有进程必须进行关联才能工作。只要是与网络相关的应用程序,都必须使用socket。


Python的Socket编程中一般分为TCP和UDP两种通讯协议,而socket是基于C/S架构的,所以socket网络编程,需要编写客户端程序和服务端程序。

TCP通信流程

客户端流程

  1. 初始化socket()

  2. 使用ip和端口号connect()连接服务器

  3. 使用recv()接收数据,send()发送数据与服务器进行交互

  4. 关闭socket()

服务端流程

  1. 初始化socket()

  2. 使用bind()绑定ip和端口号

  3. 使用listen()监听消息

  4. 获取客户端的套接字地址accept()

  5. 使用recv()接收数据,send()发送数据与客户端进行交互

  6. 关闭socket()

在Python中使用socket.socket类即可实现TCP程序开发socket.socket(AddressFamily, Type)

参数说明:

  • AddressFamily 表示IP地址类型, 分为TPv4和IPv6

  • Type 表示传输协议类型

常用方法如下:

函数 描述
socket() 获取socket类对象
bind((hostname, port)) 在指定主机的端口绑定监听
listen() 在绑定端口上开启监听,参数表示最大等待建立连接的个数
accept() 等待客户端连接,连接后返回客户端地址
send(data) 发送数据,data 是二进制数据
recv(buffer) 表示接收数据, buffersize 是每次接收数据的长度
close() 关闭套接字连接
connect((hostname, port)) 设置要连接的主机名称与端口号

使用Python实现TCP通信代码:

服务器端:

import socket
# 创建一个socket对象,默认TCP套接字
s = socket.socket()
# 绑定端口
s.bind(('127.0.0.1',9006))
# 监听端口
s.listen(5)
print("正在连接中……")

# 建立连接之后,持续等待连接
while 1:
    # 阻塞等待连接
    sock,addr = s.accept()
    print(sock,addr)
    # 一直保持发送和接收数据的状态
    while 1:
        text = sock.recv(1024)
        # 客户端发送的数据为空的无效数据
        if len(text.strip()) == 0:
            print("服务端接收到客户端的数据为空")
        else:
            print("收到客户端发送的数据为:{}".format(text.decode()))
            content = input("请输入发送给客户端的信息:")
            # 返回服务端发送的信息
            sock.send(content.encode())

    sock.close()

客户端:

import socket
# 创建一个socket对象
s1 = socket.socket()
s1.connect(('127.0.0.1', 9006))
# 不断发送和接收数据
while 1:
    send_data = input("客户端要发送的信息:")
    # socket传递的都是bytes类型的数据,需要转换一下
    s1.send(send_data.encode())
    # 接收数据,最大字节数1024,对返回的二进制数据进行解码
    text = s1.recv(1024).decode()
    print("服务端发送的数据:{}".format(text))
    print("------------------------------")

因为网络通信需要通过ip地址找到网络中的设备,通过端口号找到对应进程的端口,所以客户端ip端口必须和客户端ip端口保持一致。

当客户端和服务端建立连接后,退出程序后端口号不会立即释放,需要等待大概1-2分钟。可以通过设置端口复用解决(tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

上面的代码实现了TCP服务端程序只能服务于一个客户端,如果服务端程序要和多个客户端通信,则可以使用多线程或者socketserver模块,socketserver是socket的再封装,从而简化socket网络编程的方法。

更多关于python socket的使用,可以查看官方文档学习:

https://docs.python.org/zh-cn/3/library/socketserver.html#module-socketserver

https://docs.python.org/zh-cn/3/library/socket.html

https://docs.python.org/zh-cn/3/howto/sockets.html

好书推荐《Python数据分析与可视化从入门到精通》本书以“零基础”为起点,系统地介绍了Python在数据处理与可视化分析方面的应用。没有高深理论,每章都以实例为主,读者参考书中源码运行,就能得到与书中一样的结果。相比大而全的书籍资料,本书能让读者尽快上手,开始项目开发,非常适合希望从事Python数据处理与可视化的用户学习。

留言点赞送此书: 点在看本文并留言(本文内容相关、本书相关、其他公众号建议),我将随机挑选一位粉丝包邮送出本书(同一人一个月只有一次机会),送书活动会持续进行,机会多多,大家持续关注,感谢。

猜你喜欢

转载自blog.csdn.net/XingLongSKY/article/details/120320333