在循环引用外部后,变量(突然)变为无。 Python 3中的套接字

时间:2015-10-10 18:05:35

标签: python sockets python-3.x

我正在尝试制作两个使用套接字的简单函数,并充当发送一些文本的服务器/客户端。

我可以发送文字并将其打印出来,但是当我将其存储在变量中并尝试访问外部时创建的while循环 ,变量变为None

这是我的(完整的,因为它非常小)代码:

send.py(客户端):

import socket   
def send(HOST2 = "localhost", PORT2 = 50007,):
    s2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s2.connect((HOST2, PORT2))
    s2.sendall(b"Hello, world!")
    s2.close()
send()

上面的代码按预期工作。

recive.py(服务器):

import socket
def recive(HOST = "localhost", PORT = 50007):

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((HOST, PORT))
    s.listen(1)
    conn, addr = s.accept()
    while True:
        global data
        data = conn.recv(1024).decode("ascii") 
        print(data) #This will print correctly as expected
        if not data: break
    conn.close()
recive()
print(data) #This is None

我的问题是如何在循环外使用变量数据。由于某种原因,它是无。我的猜测是它必须对本地/全局变量做一些事情,或者它是套接字模块的行为方式。

编辑:我更改了代码,问题仍然存在。 更改:添加了recive()send()来电。

2 个答案:

答案 0 :(得分:1)

您的print语句不仅在循环之外,而且在函数之外。它将在函数被调用之前执行,并且无法访问函数中的数据变量。

将它缩进一个级别,以便它在函数内。

答案 1 :(得分:1)

少数事情:

首先,通常会将你的全局变量声明为函数的顶部,而不是在中途

其次,您的代码还有更多内容吗?因为从你发布的内容中你定义了一个函数,然后尝试访问一个由它设置的全局而不实际调用它。

更新

我运行了更新的代码,它对我来说很好用

var MyController = function($scope, $http, $compile) {
    // controller function ...
}

MyController.$inject = ['$scope', '$http', '$compile'];

myApp.controller("videoController", MyController);

更新#2:

我猜你的插座是阻塞的;对于典型情况来说,它会等待一些数据在返回之前返回,这意味着当你试图破解时它不会是假的。这意味着您的while循环将永远不会终止,并且第二次打印将不会执行。为了测试这个理论,在第一次印刷之后和>>> import socket >>> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) >>> s.connect(('localhost', 50007)) >>> s.sendall('test') >>> pi@raspberrypi ~ $ python recive.py test

之前暂停