侧边栏壁纸
  • 累计撰写 119 篇文章
  • 累计创建 25 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

tcp服务端程序开发

梁来福
2022-02-07 / 0 评论 / 0 点赞 / 0 阅读 / 3953 字
温馨提示:
本文最后更新于 2024-05-06,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

这里还是使用iphone模拟客户端进行操作

单人版服务端程序

代码实现

import socket

if __name__ == '__main__':
    # 1、创建tcp服务端套接字
    # AF_INET:IPv4地址类型
    # SOCK_STREAM:tcp传输协议类型
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 2、绑定端口号
    # "":第一个参数表示ip地址,一般不用指定则表示本机任何一个ip
    # 9090:第二个参数表示端口号
    tcp_server_socket.bind(("", 9999))

    # 3、设置监听
    # 128:表示最大等待建立连接的个数
    tcp_server_socket.listen(128)

    # 4、等待接收客户端的连接请求
    # 注意点:每次当客户端和服务端建立连接成功都会返回一个新的套接字;
    # tcp_server_socket套接字只是负责等待接收客户端的连接请求,收发数据不使用该套接字
    new_client, ip_port = tcp_server_socket.accept()
    print("客户端的ip和端口号为:", ip_port)

    # 5、接收客户端的数据
    # 收发数据都是使用返回的这个新的套接字
    recv_data = new_client.recv(1024)
    # 对二进制的数据进行解码变成字符串
    recv_content = recv_data.decode("utf-8")
    print("接收到客户端的数据为:", recv_content)

    # 6、发送数据到客户端
    send_content = "服务端正在维护中..."
    # 对字符串数据进行编码
    send_data = send_content.encode("utf-8")
    # 发送
    new_client.send(send_data)
    # 关闭服务与客户端套接字,表示和客户端终止通信
    new_client.close()

    # 7、关闭服务端套接字,表示服务端不再等待接收客户端的连接请求(维护中)
    tcp_server_socket.close()

run运行代码

客户端连接服务端,即可看见控制台(服务端)打印出客户端信息;

接着发送信息到服务端

image.png

image.png

多人版服务端程序(服务于多个客户端)

代码实现

import socket
import threading

# 处理客户端请求的任务函数
def handle_client_request(ip_port, new_client):
    print("客户端的ip和端口号为:", ip_port)

    # 5、接收客户端的数据
    # 收发数据都是使用返回的这个新的套接字
    # 循环接收客户端的数据
    while True:
        recv_data = new_client.recv(1024)
        # 判断此容器如果接受到了数据
        if recv_data:
            print("接受到的数据长度是:", len(recv_data))
            # 对二进制的数据进行解码变成字符串
            recv_content = recv_data.decode("utf-8")
            print("接收到客户端的数据为:", recv_content, "客户端的IP端口为:", ip_port)

            # 6、发送数据到客户端
            send_content = "服务端正在维护中..."
            # 对字符串数据进行编码
            send_data = send_content.encode("utf-8")
            # 发送
            new_client.send(send_data)
        # 如果没有接受到数据则表示客户端关闭连接,此时则服务端也向客户端关闭连接break
        else:
            print("客户端已关闭连接,下线了,此客户端的ip端口为:", ip_port)
            break
    # 关闭服务与客户端套接字,表示和客户端终止通信
    new_client.close()

if __name__ == '__main__':
    # 1、创建tcp服务端套接字
    # AF_INET:IPv4地址类型
    # SOCK_STREAM:tcp传输协议类型
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置端口号复用:服务端程序退出后立即释放端口
    # SOL_SOCKET:表示当前套接字
    # SO_REUSEADDR:表示复用端口号的选项
    # True:确定复用
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

    # 2、绑定端口号
    # "":第一个参数表示ip地址,一般不用指定则表示本机任何一个ip
    # 9090:第二个参数表示端口号
    tcp_server_socket.bind(("", 9999))

    # 3、设置监听
    # 128:表示最大等待建立连接的个数
    tcp_server_socket.listen(128)

    # 4、等待接收客户端的连接请求
    # 注意点:每次当客户端和服务端建立连接成功都会返回一个新的套接字;
    # tcp_server_socket套接字只是负责等待接收客户端的连接请求,收发数据不使用该套接字
    # 循环等待接受客户端的连接请求
    while True:
        new_client, ip_port = tcp_server_socket.accept()
        # 当客户端和服务端建立连接成功,创建一个子线程专门负责接受客户端的数据
        sub_thread = threading.Thread(target=handle_client_request, args=(ip_port, new_client))
        # 设置守护主线程,主线程退出子线程直接销毁
        sub_thread.setDaemon(True)
        # 启动子线程执行对应的任务
        sub_thread.start()


    # 7、关闭服务端套接字,表示服务端不再等待接收客户端的连接请求(维护中)
    # 因为服务端的程序需要一直运行,所以关闭服务端套接字的代码可以省略不写
    #tcp_server_socket.close()

运行代码

客户端点击连接,可以一直不停的发送数据,服务端也可以一直接受;

当客户端断开连接时,服务端则也断开

image.png

image.png

服务端退出

客户端与服务端建立连接后,当服务端代码直接退出,主进程退出则子进程直接销毁

image.png

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin
博主关闭了所有页面的评论