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

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

相关推荐
孞㐑¥19 分钟前
C++之红黑树
开发语言·c++·经验分享·笔记
狗蛋不是狗32 分钟前
Python 实现的运筹优化系统代码详解(0-1规划背包问题)
python·数学建模·背包问题·0-1规划·狗蛋不是狗
字节旅行者1 小时前
C++中如何使用STL中的list定义一个双向链表,并且实现增、删、改、查操作
开发语言·数据结构·c++·链表
搞程序的心海1 小时前
用Scala玩转Flink:从零构建实时处理系统
开发语言·flink·scala
写代码的小王吧1 小时前
【网络安全】 防火墙技术
java·python·安全·web安全·网络安全·docker
x66ccff1 小时前
[特殊字符] Pandas 常用操作对比:Python 运算符 vs Pandas 函数
开发语言·python·pandas
小白的高手之路1 小时前
torch.nn中的非线性激活介绍合集——Pytorch中的非线性激活
人工智能·pytorch·python·深度学习·神经网络·机器学习·cnn
逆风优雅1 小时前
python 爬取网站图片的小demo
开发语言·python
码界筑梦坊2 小时前
基于Pyhon的京东笔记本电脑数据可视化分析系统
python·信息可视化·数据分析·毕业设计·电脑·销量预测
m0_616188492 小时前
PDF预览-搜索并高亮文本
开发语言·javascript·ecmascript