我正在尝试制作两个使用套接字的简单函数,并充当发送一些文本的服务器/客户端。
我可以发送文字并将其打印出来,但是当我将其存储在变量中并尝试访问外部时创建的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()
来电。
答案 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