【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()
    

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

相关推荐
三品吉他手会点灯12 小时前
C语言学习笔记 - 50.流程控制4 - 流程控制为什么非常非常重要
c语言·开发语言·笔记·学习
闵孚龙13 小时前
动态图机制:为什么 PyTorch 调试起来更舒服
人工智能·pytorch·python
chushiyunen13 小时前
langchain4j笔记、tools
笔记·python·flask
程序员三藏14 小时前
Web自动化测试详解
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
在放️14 小时前
Python 爬虫 · 第三方代理接入与合规使用
开发语言·爬虫·python
KANGBboy14 小时前
java知识五(继承)
java·开发语言
c++之路15 小时前
Bazel C++ 构建系列文档(三):构建第一个 C++ 项目
开发语言·c++
AI人工智能+电脑小能手15 小时前
【大白话说Java面试题 第117题】【并发篇】第17题:线程有几种状态,之间如何转换?
java·开发语言·面试
财经资讯数据_灵砚智能15 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(夜间-次晨)2026年6月14日
大数据·人工智能·python·ai·信息可视化·自然语言处理·灵砚智能
森G15 小时前
61、信号与槽机制在 TCP 编程中的应用---------网络编程
网络·c++·qt·网络协议·tcp/ip