wnhuiyou 发表于 2020-3-19 09:34:20

如何让return返回值后继续运行?

本帖最后由 wnhuiyou 于 2020-3-19 14:18 编辑

我现在想实现这么一个功能,return返回一个值之后,不要结束代码,让它继续在while里面循环,代码如下:

A.py
import B

t = B.tcp()

while True:
        print(t.tcp_server())


B.py
import socket

class tcp(object):

    def tcp_server(slef):

      # 创建套接字
      slef.tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

      # 绑定IP和端口
      slef.tcp_client_socket.bind(('192.168.0.114', 8081))

      # 设置监听
      slef.tcp_client_socket.listen(128)
      while True:
            # 等待连接
            slef. new_client_socket, slef.client_addr = slef.tcp_client_socket.accept()

            while True:
                # 接收客户端发送的请求
                slef.recv_data = slef.new_client_socket.recv(1024)

                # 回发信息给客户端
                slef.new_client_socket.send("成功!".encode("GBK"))

                if slef.recv_data.decode("GBK") == "退出":

                  # 关闭套接字
                  print("连接断开!")
                  slef.new_client_socket.close()
                  return exit()

                return slef.recv_data.decode('GBK')



我现在用网络调试工具,发送数据 A.py 能正常打印出来 我输入的数据,但是只能打印一次,因为return后 B.py 就结束了,无法做到 不停发送 不停接收我了解到可以用迭代器 yield但是我用了之后没有效果,想请教下大家怎么修改?

我把代码全部粘贴出来了
A.py
from ctypes import *
import B.tcp_server


dll = CDLL("D:\python\DLL\proRFL.dll")


class User_Car(object):

    def __init__(self, d_12, dlsCoID, CardNo, dai, LLock, pdoors, BDate, EDate, LLockNo):
      self.d_12 = d_12
      self.dlsCoID = dlsCoID
      self.CardNo = CardNo
      self.dai = dai
      self.LLock = LLock
      self.pdoors = pdoors
      self.BDate = BDate
      self.EDate = EDate
      self.LockNo = LLockNo
      self.cardHexStr = bytes(72)

    # 初始化
    def csh(self):
      ret = dll.initializeUSB(1)   # 打开USB接口
      return ret

    # 蜂鸣 1秒
    def jiao(self):
      self.ret = dll.Buzzer(1, 10)

      return self.ret

    # 发行“客人卡”,又称“宾客卡”或“房卡”
    def faka(self):
      self.ret = dll.GuestCard(self.d_12, self.dlsCoID, self.CardNo, self.dai, self.LLock, self.pdoors, self.BDate,self.EDate, self.LockNo, self.cardHexStr)

      return self.ret

    # 读卡数据
    def du(self):
      self.buffData = bytes(72)
      self.ret = dll.ReadCard(self.d_12, self.buffData)

      return self.ret

    # 读卡锁号
    def suohao(self):
      self.LockNo = bytes(8)
      self.cardHexStr = self.buffData
      self.ret = dll.GetGuestLockNoByCardDataStr(self.dlsCoID, self.cardHexStr, self.LockNo)

      return self.ret


tcp = DLL.tcp_server.tcp()

p = tcp.tcp_server().split(',')

t = User_Car(p, p, p, p, p, p, p.encode('GB2312'), p.encode('GB2312'), p.encode('GB2312'))


# 发卡
t.faka()
print(t.cardHexStr.decode('UTF-8'))

# 读卡数据
t.du()
print(t.buffData.decode('GB2312'))

B.py
import socket
# 服务端


class tcp(object):

    def tcp_server(self):

      # 创建套接字
      self.tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

      # 绑定IP和端口
      self.tcp_client_socket.bind(('192.168.0.114', 8081))

      # 设置监听
      self.tcp_client_socket.listen(128)
      while True:
            # 等待连接
            self. new_client_socket, self.client_addr = self.tcp_client_socket.accept()

            while True:
                # 接收客户端发送的请求
                self.recv_data = self.new_client_socket.recv(1024)

                # 回发信息给客户端
                self.new_client_socket.send("成功!".encode("GBK"))

                if self.recv_data.decode("GBK") == "退出":

                  # 关闭套接字
                  print("连接断开!")
                  self.new_client_socket.close()
                  return exit()

                return self.recv_data.decode('GBK')






hrp 发表于 2020-3-19 10:16:08

yield在循环内使用就能不断返回值

比如
def test():
    s = 0
    while s < 100:
      yield s
      s += 1
for i in test():
    print(i)

txxcat 发表于 2020-3-19 10:24:29

最简单粗暴的方法,把 t = B.tcp()加到while循环里:
import B
while True:
      t = B.tcp()
      print(t.tcp_server())


第二个方法,把print写到class里去
import socket

class tcp(object):

    def tcp_server(slef):

      # 创建套接字
      slef.tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

      # 绑定IP和端口
      slef.tcp_client_socket.bind(('192.168.0.114', 8081))

      # 设置监听
      slef.tcp_client_socket.listen(128)
      while True:
            # 等待连接
            slef. new_client_socket, slef.client_addr = slef.tcp_client_socket.accept()

            while True:
                # 接收客户端发送的请求
                slef.recv_data = slef.new_client_socket.recv(1024)

                # 回发信息给客户端
                slef.new_client_socket.send("成功!".encode("GBK"))

                if slef.recv_data.decode("GBK") == "退出":

                  # 关闭套接字
                  print("连接断开!")
                  slef.new_client_socket.close()
                  return exit()

                print(slef.recv_data.decode('GBK'))
                return

wangka 发表于 2020-3-19 10:28:11

只要在while里面就行了

永恒的蓝色梦想 发表于 2020-3-19 11:32:25

多嘴一句,slef 的正确拼写是 self。

wnhuiyou 发表于 2020-3-19 14:09:37

永恒的蓝色梦想 发表于 2020-3-19 11:32
多嘴一句,slef 的正确拼写是 self。

对耶,可是为什么 我写slef 它没报错? 也能通过?

wnhuiyou 发表于 2020-3-19 14:10:12

wangka 发表于 2020-3-19 10:28
只要在while里面就行了

不行

wnhuiyou 发表于 2020-3-19 14:12:01

txxcat 发表于 2020-3-19 10:24
最简单粗暴的方法,把 t = B.tcp()加到while循环里:




第一个方法,我也是了好像不像,因为我要接收那个数据后,进行一个另外的操作

第二个方法,可以循环发送,但是return回去的是空,这样A.py 就拿不到数据 做处理了

wnhuiyou 发表于 2020-3-19 14:12:36

hrp 发表于 2020-3-19 10:16
yield在循环内使用就能不断返回值

比如


这个是加在class里面吗? 还是 A.py文件里面?

永恒的蓝色梦想 发表于 2020-3-19 14:32:22

wnhuiyou 发表于 2020-3-19 14:09
对耶,可是为什么 我写slef 它没报错? 也能通过?

参数写什么都一样啦,不过官方建议是self

hrp 发表于 2020-3-20 12:20:43

wnhuiyou 发表于 2020-3-19 14:12
这个是加在class里面吗? 还是 A.py文件里面?

写在你需要不断返回数据的函数里。但是如果没有什么必需要从中间返回数据然后继续往下执行的场景,没必要用yield,从调用处用循环重复调用函数,结果也是一样的
页: [1]
查看完整版本: 如何让return返回值后继续运行?