【发布时间】:2021-05-17 04:56:20
【问题描述】:
我正在尝试编写一个从服务器接收数据流的套接字客户端。 我能够获得前几个字节,但随后就中断了。
代码:
import socket
import sys
readOut = 0 # serial data
ipaddr = "192.168.1.246" # ip address of digital thermometer socket server
#def hitsocket(ipaddr):
#with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
print ("Starting up")
connected = False
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
try:
s.connect((ipaddr , 8080))
amount_received = 0
while True:
data = s.recv(1024)
amount_received += len(data)
if not data:
break
print(amount_received, end="\n")
while True:
print ("Reading: ", amount_received)
if "Fahrenheit" in amount_received:
cread = amount_received[22:-2]
newcread = float(cread)
print("readOut ", amount_received, "cread ", cread,
"newcread ", newcread)
break
print ("Restart")
finally:
print(sys.stderr, 'closing socket')
s.close()
输出:
Starting up
19
Writing: 1
Reading: 19
<_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'> closing socket
Traceback (most recent call last):
File "climatemngrDebug-v3.py", line 58, in <module>
if "Fahrenheit" in amount_received:
TypeError: argument of type 'int' is not iterable
socket的netcat输出:
kermit@whale:~/dev $ netcat 192.168.1.246 8080
mcp9809 Fahrenheit 72.0500
mcp9809 Fahrenheit 72.0500
mcp9809 Fahrenheit 72.0500
mcp9809 Fahrenheit 72.1625
mcp9809 Fahrenheit 72.0500
mcp9809 Fahrenheit 72.0500
mcp9809 Fahrenheit 72.1625
mcp9809 Fahrenheit 72.0500
如何让我的套接字输出一整行数据?
我已经阅读了 python 文档,我也查看了其他示例,但我仍然弄错了。
【问题讨论】:
-
amount_received是一个整数,而不是数据。名义上,您想查看文本是否在data中,它保存接收到的数据(作为您可能想要解码为字符串的字节)。您能告诉我们更多有关传入数据的信息吗?你怎么知道你什么时候收到了正确的金额?它是单次读取,并且遥控器在发送时关闭套接字?它是一系列以换行符结尾的文本字符串吗?您的while需要知道何时读取了正确数量的数据并且可以提取它。 -
amount_received 实际上是一个包含整数的字符串,我必须将其取出。我无法获得足够的信息来看看出了什么问题。我发布了数据。网猫输出。我的输出应该和 netcat 的输出一样。
-
amount_received += len(data).. 它是一个整数。 netstat 输出一开始并没有点击我,所以这是一堆以 lline 结尾的字符串。 -
那条线并没有像我想象的那样。我不知道。
-
@tdelaney 当我用数据交换 amount_received 时,我得到 <_io.textiowrapper name="<stderr>" mode="w" encoding="UTF-8"> 关闭套接字
标签: python python-3.x loops sockets iterator