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

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

相关推荐
吴佳浩6 小时前
Python入门指南(六) - 搭建你的第一个YOLO检测API
人工智能·后端·python
长安第一美人7 小时前
C 语言可变参数(...)实战:从 logger_print 到通用日志函数
c语言·开发语言·嵌入式硬件·日志·工业应用开发
Larry_Yanan7 小时前
Qt多进程(一)进程间通信概括
开发语言·c++·qt·学习
superman超哥7 小时前
仓颉语言中基本数据类型的深度剖析与工程实践
c语言·开发语言·python·算法·仓颉
不爱吃糖的程序媛8 小时前
Ascend C开发工具包(asc-devkit)技术解读
c语言·开发语言
bu_shuo8 小时前
MATLAB奔溃记录
开发语言·matlab
Learner__Q8 小时前
每天五分钟:滑动窗口-LeetCode高频题解析_day3
python·算法·leetcode
————A8 小时前
强化学习----->轨迹、回报、折扣因子和回合
人工智能·python
你的冰西瓜8 小时前
C++标准模板库(STL)全面解析
开发语言·c++·stl
徐先生 @_@|||8 小时前
(Wheel 格式) Python 的标准分发格式的生成规则规范
开发语言·python