前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python网络编程之Socket通信简单实现(文末赠书)

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

作者头像
吾非同
发布2021-09-24 15:51:26
4.6K0
发布2021-09-24 15:51:26
举报
文章被收录于专栏:吾非同

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通信代码:

服务器端:

代码语言:javascript
复制
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()

客户端:

代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 吾非同 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • TCP通信流程
  • 使用Python实现TCP通信代码:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档