人工智能-Python网络编程-TCP

1 TCP-概念版

服务端
python 复制代码
import socket
​
# 1 创建服务端套接字对象
#   socket.AF_INET IPV4
#   socket.SOCK_STREAM TCP
#   socket.SOCK_DGRAM UDP
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
​
# 2 绑定端口号
tcp_server_socket.bind(('192.168.124.7', 8888))
​
# 3 设置监听
#   参数为允许最大的连接数
tcp_server_socket.listen(1)
​
# 4 等待接收客户端的连接请求
new_socket, client_connect = tcp_server_socket.accept()
​
# 5 接收数据
recv_data = new_socket.recv(1024).decode(encoding='utf-8')
print(recv_data)
​
# 6 发送数据
new_socket.send('<服务器>: 已收到数据'.encode('utf-8'))
​
# 7 关闭套接字
tcp_server_socket.close()
客户端
python 复制代码
import socket
​
# 1 创建套接字对象
#   socket.AF_INET IPV4
#   socket.SOCK_STREAM TCP
#   socket.SOCK_DGRAM UDP
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
​
# 2 与服务器建立连接
tcp_client_socket.connect(('192.168.124.7', 8888))
​
# 3 发送数据(必须是字节流类型数据)
tcp_client_socket.send('<客户端>: 请求发送数据'.encode(encoding='utf-8'))
​
# 4 接收数据
recv_data = tcp_client_socket.recv(1024).decode(encoding='utf-8')
print(recv_data)
​
# 5 关闭套接字
tcp_client_socket.close()
​

2 TCP-基础对话版

服务端
python 复制代码
import socket
​
IPV4_ADDR = '192.168.124.7'
IPV4_PORT = 8888
​
​
# TCP 服务端程序必须绑定端口号,否则客户端找不到这个 TCP 服务端程序
class ServerSocket(object):
    def __init__(self):
        # 1 创建服务端套接字对象
        #   socket.AF_INET IPV4
        #   socket.SOCK_STREAM TCP
        #   socket.SOCK_DGRAM UDP
        self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
​
        # 设置端口复用 如果程序执行结束,则让其占用的端口立即释放
        self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
​
        # 2 绑定端口号
        self.tcp_server_socket.bind((IPV4_ADDR, IPV4_PORT))
​
        # 3 设置监听
        # listen 后的套接字属于被动套接字,只负责接收新的客户端的连接请求不能收发消息
        #   参数为允许最大的连接数
        self.tcp_server_socket.listen(1)
​
    def start(self):
        while True:
            # 4 等待接收客户端的连接请求
            # 当 TCP 客户端程序和 TCP 服务端程序连接成功后,TCP 服务端程序会产生一个新的套接字,收发客户端消息使用该套接字
            client_socket, client_connect = self.tcp_server_socket.accept()
​
            while True:
                # 5 接收数据
                recv_data = client_socket.recv(1024).decode(encoding='utf-8')
                # 当客户端的套接字调用 close 后,服务器端的 recv 会解阻塞,返回的数据长度为0
                if len(recv_data) <= 0:
                    client_socket.close()
                print(f'接收到客户端 {client_connect[0]}:{client_connect[1]} 发来的消息: {recv_data}')
​
                # 6 发送数据
                send_data = input('(请输入消息按 Enter 键发送): ')
                if send_data in ('q', 'Q'):
                    # 7 关闭 客户-服务 套接字
                    client_socket.close()
                    break
                client_socket.send(send_data.encode('utf-8'))
​
    def __del__(self):
        # 5 关闭套接字
        self.tcp_server_socket.close()
​
​
if __name__ == '__main__':
    server_socket = ServerSocket()
    server_socket.start()
客户端 ​
python 复制代码
import socket
​
IPV4_ADDR = '192.168.124.7'
IPV4_PORT = 8888
​
​
# TCP 客户端程序一般不需要绑定端口号,因为客户端是主动发起建立连接的
class ClientSocket():
    def __init__(self):
        while True:
            # 1 创建套接字对象
            #   socket.AF_INET IPV4
            #   socket.SOCK_STREAM TCP
            #   socket.SOCK_DGRAM UDP
            tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
​
            # 2 与服务器建立连接
            tcp_client_socket.connect((IPV4_ADDR, IPV4_PORT))
​
            while True:
                # 3 发送数据(必须是字节流类型数据)
                send_data = input('(请输入消息按 Enter 键发送): ')
                if send_data in ('q', 'Q'):
                    # 5 关闭套接字
                    tcp_client_socket.close()
                    return
                tcp_client_socket.send(send_data.encode(encoding='utf-8'))
​
                # 4 接收数据
                recv_data = tcp_client_socket.recv(1024).decode(encoding='utf-8')
                # 当服务端的套接字调用 close 后,客户端的 recv 会解阻塞,返回的数据长度为0
                if len(recv_data) <= 0:
                    tcp_client_socket.close()
                    return
                print(f'接收到服务端回复的消息: {recv_data}')
​
​
if __name__ == '__main__':
    socket = ClientSocket()
相关推荐
想会飞的蒲公英16 分钟前
TF-IDF + 随机森林中文文本分类全链路实战:从训练脚本到 Flask API + Streamlit 前端
人工智能·pytorch·python·随机森林·分类·flask·tf-idf
FriendshipT25 分钟前
Ultralytics:解读C3模块
人工智能·pytorch·python·深度学习·目标检测
极光代码工作室26 分钟前
基于深度学习的异常行为检测系统
人工智能·python·深度学习·神经网络·机器学习
承渊政道26 分钟前
【Python学习】(了解Python背景知识、搭建 Python 环境以及安装PyCharm)
python·学习·pycharm·搭建python环境
川石课堂软件测试29 分钟前
性能测试|Nginx中间件监控与调优
linux·python·nginx·中间件·单元测试·压力测试·harmonyos
yqcoder1 小时前
什么是 Math 对象
网络·网络协议·udp
I'm a winner9 小时前
【IP核】 Xilinx FPGA LVDS 高速接口,含验证工程与板级测试用例
tcp/ip·fpga开发·测试用例
Lyn_Li9 小时前
扫描 PDF 歪了怎么办?用 6 种检测方法做本地批量扶正(附开源工具)
python·pdf·ocr·tesseract·开源工具·文档处理·本地处理·扫描件纠偏
金銀銅鐵10 小时前
费马小定理
python·数学·算法
Piko61411 小时前
H3C IRF2 堆叠实战:打造高可靠核心交换网络
运维·网络·笔记