首页 > 编程语言 >Python网络编程之TCP服务端程序开发

Python网络编程之TCP服务端程序开发

时间:2023-01-06 10:01:46浏览次数:40  
标签:socket Python 程序开发 TCP 服务端 接字 recv 端口号 客户端

 一、开发 TCP 服务端程序开发步骤回顾

  1. 创建服务端端套接字对象
  2. 绑定端口号
  3. 设置监听
  4. 等待接受客户端的连接请求
  5. 接收数据
  6. 发送数据
  7. 关闭套接字

二、socket 类的介绍

导入 socket 模块
import socket

创建服务端 socket 对象
socket.socket(AddressFamily, Type)

参数说明:

  • AddressFamily 表示IP地址类型, 分为TPv4和IPv6
  • Type 表示传输协议类型

方法说明:

  • bind((host, port)) 表示绑定端口号, host 是 ip 地址,port 是端口号,ip 地址一般不指定,表示本机的任何一个ip地址都可以。
  • listen (backlog) 表示设置监听,backlog参数表示最大等待建立连接的个数。
  • accept() 表示等待接受客户端的连接请求
  • send(data) 表示发送数据,data 是二进制数据
  • recv(buffersize) 表示接收数据, buffersize 是每次接收数据的长度

三、TCP 服务端程序开发示例代码

import socket

if __name__ == '__main__':
# 创建tcp服务端套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口号复用,让程序退出端口号立即释放
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 给程序绑定端口号
tcp_server_socket.bind(("", 8989))
# 设置监听
# 128:最大等待建立连接的个数, 提示: 目前是单任务的服务端,同一时刻只能服务与一个客户端,后续使用多任务能够让服务端同时服务与多个客户端,
# 不需要让客户端进行等待建立连接
# listen后的这个套接字只负责接收客户端连接请求,不能收发消息,收发消息使用返回的这个新套接字来完成
tcp_server_socket.listen(128)
# 等待客户端建立连接的请求, 只有客户端和服务端建立连接成功代码才会解阻塞,代码才能继续往下执行
# 1. 专门和客户端通信的套接字: service_client_socket
# 2. 客户端的ip地址和端口号: ip_port
service_client_socket, ip_port = tcp_server_socket.accept()
# 代码执行到此说明连接建立成功
print("客户端的ip地址和端口号:", ip_port)
# 接收客户端发送的数据, 这次接收数据的最大字节数是1024
recv_data = service_client_socket.recv(1024)
# 获取数据的长度
recv_data_length = len(recv_data)
print("接收数据的长度为:", recv_data_length)
# 对二进制数据进行解码
recv_content = recv_data.decode("gbk")
print("接收客户端的数据为:", recv_content)
# 准备发送的数据
send_data = "ok, 问题正在处理中...".encode("gbk")
# 发送数据给客户端
service_client_socket.send(send_data)
# 关闭服务与客户端的套接字, 终止和客户端通信的服务
service_client_socket.close()
# 关闭服务端的套接字, 终止和客户端提供建立连接请求的服务
tcp_server_socket.close()

执行结果:
客户端的ip地址和端口号: ('172.16.47.209', 52472)
接收数据的长度为: 5
接收客户端的数据为: hello

说明:

当客户端和服务端建立连接后,服务端程序退出后端口号不会立即释放,需要等待大概1-2分钟。

解决办法有两种:

  1. 更换服务端端口号
  2. 设置端口号复用(推荐大家使用),也就是说让服务端程序退出后端口号立即释放。

设置端口号复用的代码如下:

# 参数1: 表示当前套接字
# 参数2: 设置端口号复用选项
# 参数3: 设置端口号复用选项对应的值
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

网络调试助手充当客户端程序:

Python网络编程之TCP服务端程序开发_端口号

标签:socket,Python,程序开发,TCP,服务端,接字,recv,端口号,客户端
From: https://blog.51cto.com/u_13236892/5992181

相关文章

  • 新手如何完成python视频爬虫
    作为新手小白学习爬虫,重要的就是实战经验,爬虫语言有多种,今天我们就通过python语言来做爬虫视频,下面的代码值得大家借鉴参考。#coding=utf-8importjsonimportos.pathimpo......
  • 【团队效率提升】Python-PyWebIO介绍
    作者:京东零售关键Q&A快速了解PyWebIOQ:首先,什么是PyWebIO?A:PyWebIO提供了一系列命令式的交互函数,能够让咱们用只用Python就可以编写Web应用,不需要编写前端页面和后端......
  • Python文件夹操作
    如何使用python新建文件夹以及递归创建文件夹os.mkdir使用python创建文件夹,通常使用os.mkdir方法,在使用这个方法时有几个小的细节需要注意,假设你的代码是这样编写的i......
  • Python中的注释和input函数的使用
    注释:一.最基础也是最常用的注释是#注释内容 快捷键ctrl+/ 适用多个代码集成工具都是这个快捷键Python使用井号#作为单行注释的符号,语法格式为:#注释内容从井号......
  • Python接口自动化系列- 读取 ini 配置文件05
    一、ini文件的组成一个ini文件是由多个section组成,每个section中以key=vlaue形式存储数据; 二、python读取ini文件数据1、导包importconfigparserconfig=configp......
  • Python 异步:完整教程
    Asyncio允许我们在Python中使用基于协程的并发异步编程。尽管asyncio已经在Python中使用多年,但它仍然是Python中最有趣但最令人沮丧的领域之一。对于新开发人员来......
  • golang中tcp socket粘包问题和处理
    ​​http://www.01happy.com/golang-tcp-socket-adhere/​​在用golang开发人工客服系统的时候碰到了粘包问题,那么什么是粘包呢?例如我们和客户端约定数据交互格式是一个json......
  • [oeasy]python0037_终端_terminal_电传打字机_tty_shell_控制台_console_发展历史
    换行回车回忆上次内容​换行​​和​​回车​​是两回事​换行​对应字节​​0x0A​​Line-Feed水平不动垂直向上喂纸所以是​​feed​​​回车​对应字节​​0x0D......
  • [oeasy]python0037_终端_terminal_电传打字机_tty_shell_控制台_console_发展历史
    换行回车回忆上次内容换行和回车是两回事换行对应字节0x0ALine-Feed水平不动垂直向上喂纸所以是feed回车对应字节0x0DCarriage-Return垂直......
  • python 删除链表倒数第n个节点
    defdelete_k_node(self,head,index):"""删除链表倒数第k个节点:paramhead::paramindex::return:"""......