【python】socket 入门以及多线程tcp链接

Socket 入门 及 多线程tcp链接

网络基础知识三要素

Socket是套接字的意思,是网络编程的核心对象,通信两端都独有自己的Socket对象, 数据在两个Socket之间通过 字节流(TCP协议) 或者 数据报包(UDP协议)的形式进行传输.

本文主要针对tcp流程进行讲解

socket-tcp流程图

1.创建服务器端

  1. 创建服务器端Socket对象, 指定: 地址族, 传输方式.

  2. 绑定ip地址 和 端口号.

  3. 设置监听. 范围: 1 ~ 128, 一般设置为: 5

  4. 等待客户端申请建立连接, 如果有, 则创建1个新的socket对象负责和该客户端交互.

  5. 接收客户端的回执信息.

  6. 释放资源.

python 复制代码
import socket

if __name__ == '__main__':
    # AF_INET 是 ipv4 , SOCK_STREAM 是 tcp协议
    Server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 绑定的ip地址和端口号
    Server_socket.bind(('127.0.0.1', 8888)) 
    # 注:这里127.0.0.1是本地ip回路,可以自行设置ip地址和端口号
    # 监听端口号
    Server_socket.listen(5)
    # 等待链接
    accept_socket, client_info = Server_socket.accept()
    print(f'客户端 {client_info} 已连接')
    # 接收信息(这步就是具体要实现的功能)
    recv = accept_socket.recv(1024)
    print(recv.decode('utf-8'))
    # 关闭(仅关闭客户端对象.一般不关闭服务器对象)
    accept_socket.close()
    # Server_socket.close()

2. 创建客户端

  1. 创建客户端Socket对象, 指定: 地址族, 传输方式.
  2. 连接服务器端, 指定: 要连接到的服务器ip地址 和 端口号.
  3. 接收服务器端的发送的信息.
  4. 给服务端写一句话: 回执信息.
  5. 释放资源.
python 复制代码
import socket

if __name__ == '__main__':
    # 创建socket对象
    client_Socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 链接服务器
    client_Socket.connect(('127.0.0.1', 8888))
    # 发送数据
    client_Socket.send('https://blog.csdn.net/weixin_57336987?spm=1011.2415.3001.5343'.encode('utf-8'))
    # 关闭连接
    client_Socket.close()

先启动服务器端,在启动客户端,即可在服务器端接收到发送数据

3.多线程与长连接

这时有些小伙伴就要问了,你这个客户端和服务器端是一对一啊,如果客户端一直不关闭链接,别人就无法访问客户端,这里就要用到线程了

3.1创建多线程服务器端
python 复制代码
import socket
import threading
import time

socks = []
PORT = 8888  # 设置端口号
HOST = "127.0.0.1"  # 设置IP地址


def server_thread():
    global socks
    # AF_INET 是 ipv4 , SOCK_STREAM 是 tcp协议
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 绑定的ip地址和端口号
    server_socket.bind((HOST, PORT))
    # 监听端口号
    server_socket.listen(10)
    print('等待链接....')
    # 等待链接
    try:
        while True:
            # 开启线程
            accept_socket, client_info = server_socket.accept()
            print(f'客户端 {client_info} 已连接')
            p = threading.Thread(target=server_link, args=(accept_socket, client_info))
            p.start()

    except Exception as e:
        print(f'Error: {str(e)}')


def server_link(accept_socket, client_info):

    # 持续接受接收信息, 收到886结束
    while True:
        recv_data = accept_socket.recv(1024).decode('utf-8')
        print(f'来自{client_info}: {recv_data}')
        if recv_data == "886":
            break
    time.sleep(1)


if __name__ == '__main__':
    # 调用函数
    server_thread()
    # server_socket.close()
3.2创建客户端测试
python 复制代码
import socket

if __name__ == '__main__':
    # 创建socket对象
    client_Socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 链接服务器
    client_Socket.connect(('192.168.13.133', 8888))
    # 发送数据
    while True:
        data = input('请输入要发送的数据:')
        client_Socket.send(data.encode('utf-8'))
        if data == '886':
            break
    # 关闭连接
	client_Socket.close()
    

这里三个不同的客户端进行测试

相关推荐
默_笙4 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
小羊没烦恼!4 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
qq_426003965 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫5 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
长沙三为智能科技5 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读5 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
只睡四小时5 天前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
C语言小火车5 天前
C/C++ 为什么需要编译器?
开发语言·c++
奇思妙想聪明勤奋的小羊5 天前
DeepAgents第5章:子Agent 与上下文隔离—让 Agent学会委派
人工智能·python·学习·语言模型
lpfasd1235 天前
2026年第38周GitHub趋势周报
python·科技·github