03 python网络应用实战(三)tcp服务端设计实现

这篇具有很好参考价值的文章主要介绍了03 python网络应用实战(三)tcp服务端设计实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、tcp服务器

1.1 tcp服务器端的流程

  1. 创建 socket 对象
  2. 绑定IP 和端口
  3. 设置监听
  4. 阻塞等待客户端的链接
  5. 新的 socket 收信息
  6. 新的 socket 发信息
  7. 关闭

 文章来源地址https://www.toymoban.com/news/detail-724484.html

python tcp服务端,# 2 python实战1【完】,python,后端,linux,ubuntu

1.2 tcp服务端的代码实现

通常服务器在启动的时候都会绑定一个众所周知的地址(如ip地址+端口号),用于提供服务,客户就可以通过它来接连服务器;而客户端就不用指定,有系统自动分配一个端口号和自身的ip地址组合。这就是为什么通常服务器端在listen之前会调用bind(),而客户端就不会调用,而是在 connect()时由系统随机生成一个。 

代码:

import socket

if __name__ == '__main__':
    # 1 创建 socket 对象
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2 绑定 IP 和端口
    # server_socket.bind(('电脑本机IP',8888))
    server_socket.bind(('',8888)) # 前面空,绑定服务器的任意一个网卡

    # 3 监听,参数是同时连接的客户端数量
    server_socket.listen(128)
    print('等待ing.....')
    # 4 阻塞等待客户端连接
    # 返回一个元组  (新socket, (客户端IP,端口) )
    new_socket, client_ip_port = server_socket.accept()

    # 5 新的socket收信息
    buf = new_socket.recv(4096)
    print(buf.decode())
    # 6 新的socket发信息
    send_data = (f'{client_ip_port}连接成功').encode()
    new_socket.send(send_data)
    # 7 关闭
    new_socket.close()
    server_socket.close()

点击运行

启动服务端

python tcp服务端,# 2 python实战1【完】,python,后端,linux,ubuntu

 点击连接网络

python tcp服务端,# 2 python实战1【完】,python,后端,linux,ubuntu

发送消息 123

python tcp服务端,# 2 python实战1【完】,python,后端,linux,ubuntu python tcp服务端,# 2 python实战1【完】,python,后端,linux,ubuntu

 1.3 设置端口复用

刚才的代码有一个问题,就是如果端口已经使用,再次连接的时候会报错误

这就涉及端口复用的问题

 正常情况下,服务器的代码是永远不会关闭的.就不会出现这个问题

特殊情况: 启动服务器之后, 运行一次,马上关闭再次运行,会出现这个 bug, 地址已经被使用

端口需要等待 30s - 2min 才可以再次使用

代码实现让端口关闭之后,可以立刻使用,这就是端口复用

代码加在 1 创建socket对象 2 绑定 之间

 server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)

setsockop t的三个参数

  • level 设置那个级别的socket    SOL_SOCKET 表示当前socket
  • optname 设置什么内容,权限  SO_REUSEADDR 表示端口复用
  • value 设置的值,True

完整代码:

import socket

if __name__ == '__main__':
    # 1 创建 socket 对象
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 设置端口复用
    server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)

    # 2 绑定 IP 和端口
    server_socket.bind(('电脑本机IP',8888))
    # server_socket.bind(('',8888)) # 前面空,绑定服务器的任意一个网卡

    # 3 监听,参数是同时连接的客户端数量
    server_socket.listen(128)
    print('等待ing.....')
    # 4 阻塞等待客户端连接
    # 返回一个元组  (新socket, (客户端IP,端口) )
    new_socket, client_ip_port = server_socket.accept()

    # 5 新的socket收信息
    buf = new_socket.recv(4096)
    print(buf.decode())
    # 6 新的socket发信息
    send_data = (f'{client_ip_port}连接成功').encode()
    new_socket.send(send_data)
    # 7 关闭
    new_socket.close()
    server_socket.close()
    pass

1.4 判断客户端是否退出连接

其实很简单,

判断依据:

客户端退出连接的时候,服务器的socket 不再阻塞,收到一个空字符串,长度是0

使用这个空字符串去判断就行

代码:

import socket

if __name__ == '__main__':
    # 1 创建 socket 对象
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 设置端口复用
    server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)

    # 2 绑定 IP 和端口
    server_socket.bind(('电脑本机IP',8888))
    # server_socket.bind(('',8888)) # 前面空,绑定服务器的任意一个网卡

    # 3 监听,参数是同时连接的客户端数量
    server_socket.listen(128)
    print('等待ing.....')
    # 4 阻塞等待客户端连接
    # 返回一个元组  (新socket, (客户端IP,端口) )
    new_socket, client_ip_port = server_socket.accept()

    # 5 新的socket收信息
    buf = new_socket.recv(4096)

    if buf:
        print(buf.decode())
        # 6 新的socket发信息
        send_data = (f'{client_ip_port}连接成功').encode()
        new_socket.send(send_data)
    else:
        print(f'客户端{client_ip_port}断开连接')

    # 7 关闭
    new_socket.close()
    server_socket.close()
    pass

 效果:

python tcp服务端,# 2 python实战1【完】,python,后端,linux,ubuntu

1.5 多任务版本的服务器

多任务,肯定是使用进程或者线程去实现的

那么,应该在哪里使用进程或者线程呢?

应该是在有客户端连接之后,创建线程

首先,服务器等待连接应该是循环等待

其次,重复的任务,(即每一个线程应该做的任务),使用一个函数去定义实现

代码:

import socket
import threading

# 定义任务函数
def handle_request(new_socket,client_ip_port):
    while True: # 这样客户端可以一直发信息
        # 5 新的socket收信息
        buf = new_socket.recv(4096)
        if buf:
            print(buf.decode())
            # 6 新的socket发信息
            send_data = (f'{client_ip_port}连接成功').encode()
            new_socket.send(send_data)
        else:
            print(f'客户端{client_ip_port}断开连接')
            break

    # 7 关闭
    new_socket.close()


if __name__ == '__main__':
    # 1 创建 socket 对象
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 设置端口复用
    server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)

    # 2 绑定 IP 和端口
    server_socket.bind(('电脑本机IP',8888))
    # server_socket.bind(('',8888)) # 前面空,绑定服务器的任意一个网卡

    # 3 监听,参数是同时连接的客户端数量
    server_socket.listen(128)
    print('等待ing.....')
    while True:
        # 4 阻塞等待客户端连接
        new_socket, client_ip_port = server_socket.accept()
        # 有客户端连接,建立多线程
        sub_thread = threading.Thread(target=handle_request,args = (new_socket,client_ip_port) )
        sub_thread.start()

    server_socket.close()
    pass

python tcp服务端,# 2 python实战1【完】,python,后端,linux,ubuntu

 1.6 注意点

python tcp服务端,# 2 python实战1【完】,python,后端,linux,ubuntu

1.7 send 和 recv 原理

python tcp服务端,# 2 python实战1【完】,python,后端,linux,ubuntu

 python tcp服务端,# 2 python实战1【完】,python,后端,linux,ubuntu

 python tcp服务端,# 2 python实战1【完】,python,后端,linux,ubuntu

 


到了这里,关于03 python网络应用实战(三)tcp服务端设计实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 网络编程套接字应用分享【Linux &C/C++ 】【UDP应用 | TCP应用 | TCP&线程池小项目】

    目录 前提知识 1. 理解源ip,目的ip和Macip 2. 端口号 3. 初识TCP,UDP协议 4. 网络字节序 5. socket 编程 sockaddr类型  一,基于udp协议编程  1. socket——创建套接字 2. bind——将套接字强绑定  3. recvfrom——接受数据 4. sendto——发出信息  遇到的问题 (1. 云服务器中以及无法分配I

    2024年04月08日
    浏览(75)
  • 初学记录【linux应用】 TCP/UDP 网络编程 C语言

    以下内容分别为TCP 与 UDP编程,内容有相似或者重合部分,可根据流程 相互对照学习,都已经附上源码 。 **1.** socket 创建 tcp套接字 (监听的套接字) 2、IPv4套接字地址结构 #include netinet/in.h struct in_addr: 如果使用 Internet 所以 sin_family 一般为 AF_INET。 ⚫ sin_addr 设置为 INADDR_AN

    2024年02月03日
    浏览(53)
  • Android studio TCP网络调试助手应用开发(支持TCP Server与Client切换)

            在前几篇的文章中带大家完成了 基于TCP的物联网安卓应用开发 ,教程内容是创建了一个 TCP客户端并连接服务器完成数据通信的过程 ,后不久又发布了一个 ESP8266创建TCP 服务器与安卓的客户端进行通信 的一个文章,当时在文章中提到“如果大家有需要将ESP8266配置

    2024年02月06日
    浏览(49)
  • ESP32网络应用 -- ESP32-S3在STA模式下创建TCP-CLIENT应用程序

    在ESP32-S3初始化为Station模式并且成功获取IP地址后,说明ESP32-S3芯片的底层设施已经具备Wi-Fi网络通信能力,但在实际的应用场景里面,仅仅建立数据链路层,还是不能够满足应用程序的数据通信需求。 TCP/IP是一种使用广泛的网络传输协议,网络上并不缺乏关于TCP/IP的具体原理

    2024年02月15日
    浏览(29)
  • 计算机网络中的应用层和传输层(http/tcp)

    目录 1、协议的通俗理解 1.1 理解协议 2.应用层 2.1 http协议 2.2 HTTP的方法  2.3 HTTP的状态码 2.4 HTTP常见Header 3、传输层 3.1 端口号 3.1.1 端口号范围划分 3.1.2 netstat 3.1.3 认识知名端口号(Well-Know Port Number) 3.2 UDP协议 3.2.1 UDP协议端格式 3.2.2 UDP的特点 3.2.3 基于UDP的应用层协议 3.3 TCP协

    2024年02月08日
    浏览(31)
  • Hyperledger Fabric 应用实战(2)--网络节点设置

    网络名称:rentnet 联盟组织:orderer排序组织+三个成员组织supervisor、rentalcrop、 agency 通道:rentsign 账本数据库: couchdb 物理节点 组织 容器节点 supervisor supervisor.freerent.cn peer0.supervisor.freerent.cn peer1.supervisor.freerent.cn peer2.supervisor.freerent.cn couchdb0.supervisor.freerent.cn couchdb1.supervisor

    2024年02月12日
    浏览(27)
  • 高级网络应用复习——TCP与UDP,ACL列表, 防火墙,NAT复习与实验(带命令)

            作者简介:一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。   座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录  前言 一.知识点总结 1.传输层的

    2024年02月01日
    浏览(30)
  • 网络编程1—— IP地址 + 端口号 +TCP/IP协议 + 协议分层的封装与应用

    本人是一个刚刚上路的IT新兵,菜鸟!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果这篇文章可以帮助到你,劳请大家点赞转发支持一下! 从本篇文章开始就要分享网络编程的内容了,越发的感受到了编程的魅力,鸡汤来喽!! 1️⃣单机阶段:计算机跟计算

    2024年02月12日
    浏览(31)
  • 基于matlab的神经网络设计,matlab神经网络应用设计

    我来说下我的理解,不一定对,一起讨论下吧 1.100个字母,400个数字组成的训练样本应该是可以的,因为训练样本多的话会使整个网络的权值更加接近准确的权值,500个训练样本对于图像处理来说应该不算多。 2.因为预处理后的每个字母/图片为250的向量值,所有训练样本可以

    2024年02月06日
    浏览(33)
  • 【Java基础教程】(四十七)网络编程篇:网络通讯概念,TCP、UDP协议,Socket与ServerSocket类使用实践与应用场景~

    了解多线程与网络编程的操作关系; 了解网络程序开发的主要模式; 了解 TCP 程序的基本实现; 在Java中,网络编程的核心意义是实现不同电脑主机之间的数据交互。Java采用了一种简化的概念,将这个过程进一步抽象为JVM(Java虚拟机)进程之间的通信。可以在同一台电脑上

    2024年02月15日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包