python TCP 多进程网络搭建

这篇博客详细介绍了如何使用Python实现TCP/IP网络服务端和客户端的通信。服务端通过设置套接字、绑定地址端口并监听客户端连接,采用多进程方式处理每个客户端请求。客户端则连接服务器,发送请求并接收反馈。服务端能够发送多个结果,并以特定字符串结束。客户端则能接收并解析这些结果。
摘要由CSDN通过智能技术生成

TCP/IP 网络搭建

1.服务端

  • 全局变量

    from socket import *
    from multiprocessing import Process
    import signal
    import sys
    import time
    from operation_db import Database
    
    # 全局变量
    HOST = "0.0.0.0"
    PORT = 8000
    ADDR = (HOST, PORT)
    
  • 创建套接字

    s = socket()
    s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
    
  • 绑定地址与端口

    s.bind(ADDR)
    s.listen(5)
    
  • 循环等待客户端连接

    while True:
        try:
            c, addr = s.accept()
            print("connet from", addr)
        except KeyboardInterrupt:
            s.close()
            db.close()
            sys.exit("服务端退出")
        except Exception as e:
            print(e)
            continue
        # 为客户端创建子进程
        p = Process(target=request, args=(c,))
        p.daemon = True  # 主进程退出 子进程退出
        p.start()
    
  • 子进程处理函数

    # 接收客户端请求
    def request(c):
        while True:
            data = c.recv(1024).decode() 	# 接收数据
            print(c.getpeername(), ":", data)
            if not data or data[0] == "E":
                print("子进程退出")
                sys.exit()  # 对应的子进程退出
            elif data[0] == "R":
            	pass # 解析 收到命令
            	c.send(b"OK") # 发送相应的反馈
            elif data[0] == "L":
            	pass # 解析 收到命令
    	        c.send(b"Fail") # 发送相应的反馈
    
    
  • 发送多个结果

    c.send(b"OK") # 结果状态
    # 循环发送结果
    for i in range(10):
        msg = "%d" % i
        time.sleep(0.1)  # 需要延迟发送 避免粘连
        c.send(msg.encode())
    time.sleep(0.1)
    c.send(b"##") # 发送结束字符串
    

2.客户端

  1. 连接服务器

    from socket import *
    from getpass import getpass  # 运行使用终端
    import sys
    
    # 服务器地址
    ADDR = ("127.0.0.1", 8000)
    
    # tcp套接字
    s = socket()
    s.connect(ADDR)
    
  2. 发送数据给服务端

    msg = "R %s %s" % (name, passwd)
    s.send(msg.encode())  # 发送给服务器
    
  3. 接收服务端的反馈

    data = s.recv(128).decode()  # 接收结果
    if data == "OK":
    	print("成功")
    else:
    	print("失败")
    
  4. 接收多个结果数据

    # 接收结果状态
    data = s.recv(128).decode()
    
    if data == "OK":
        while True: # 循环接收结果
            hist = s.recv(1024).decode()
            if hist == "##": # 以## 结束
                break
            print(hist)
    else: # 失败的结果
        print("未查到历史记录")
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

廷益--飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值