首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ValueError:在将字符串转换为int值时,带有基10:'‘的int()文本无效

ValueError:在将字符串转换为int值时,带有基10:'‘的int()文本无效
EN

Stack Overflow用户
提问于 2019-12-07 18:19:00
回答 1查看 841关注 0票数 0

我试图通过套接字发送/恢复数据。在将字符串转换为整数值时,我将得到此错误。这个整数值是文件名的长度。

代码语言:javascript
复制
Traceback (most recent call last):

File "C:\Users\Nitesh Rathi\Desktop\clientSocket.py", line 16, in <module>

buff = int(filesize)

ValueError: invalid literal for int() with base 10: ''

代码

发送方

代码语言:javascript
复制
from socket import *
import os


HOST = '192.168.1.7'
PORT = 9999
ADDRESS = (HOST, PORT)

soc = socket(AF_INET, SOCK_STREAM)
soc.bind(ADDRESS)
soc.listen(5)
print('listen for connection...')
conn, addr = soc.accept()
print('got connection from', addr)

filename = 'file1.txt'.encode('utf-8')
fl = len(filename)
fl = str(fl)
print('size of filename :', fl, 'bytes')

conn.send(fl.encode('utf-8'))
print('size of filename sent')
conn.send(filename)
print('filename sent')
filedata = 'this is file1 data'.encode('utf-8')
conn.sendall(filedata)
print('data sent')


conn.close()
soc.close()
print('socket closed')

接收侧

代码语言:javascript
复制
from socket import *
import os


HOST = '192.168.1.7'
PORT = 9999
ADDRESS = (HOST, PORT)
PATH = "C:/Users/Nitesh Rathi/Desktop/RECV"

soc = socket(AF_INET, SOCK_STREAM)
soc.connect(ADDRESS)
print('connected to', ADDRESS)

while True:
    filesize = soc.recv(255).decode('utf-8')
    buff = int(filesize)
    print("size of filename: ", filesize, 'bytes')
    filename = soc.recv(buff).decode('utf-8')
    if not filename: break
    Path = os.path.join(PATH, filename)
    print(Path)
    file = open(Path, 'wb')
    filedata = soc.recv(1024)
    file.write(filedata)
    file.close()


soc.close()
print('socket closed')
print('data recvd')
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-07 22:20:01

TCP流套接字实现流协议,而不是消息协议,因此接收者必须事先知道它应该接收多少字节。

您的代码将文件名长度作为字符串发送,后面跟着长度,这是一个不明确的协议.例如,如果文件名为42beers.txt,则代码将写入流。

代码语言:javascript
复制
0x31  '1'
0x31  '1'
0x34  '4'
0x32  '2'
0x62  'b'
0x65  'e'
0x65  'e'
0x72  'r'
0x73  's'
0x2e  '.'
0x74  't'
0x78  'x'
0x74  't'

读者如何知道何时完成长度和文件名何时开始?

注意,理论上,第一个recv调用可能只得到1,也可能得到1142b (因为它是字节流通道,而不是消息通道)。

您所得到的错误可能是因为第二种可能性。

例如,如果文件名长度从未超过255个字节,另一种可行的方法是编写一个字节来表示字符串的长度,然后是字符串.即

代码语言:javascript
复制
0x0B  11 (length of filename)
0x34  '4'
0x32  '2'
0x62  'b'
0x65  'e'
0x65  'e'
0x72  'r'
0x73  's'
0x2e  '.'
0x74  't'
0x78  'x'
0x74  't'

这样,接收方可以使用read(1)获取一个字节(长度),然后执行另一个read(sz)来获取文件名。

简单地说,recv为您提供了从网络中接收到的任何信息,它可以少于发送方通过send传递的内容,也可以是来自作者的多个send调用的连接的一部分。如果您使用recv,那么您必须执行一个循环,直到数据被接收到为止(并且您必须知道这是多少,或者您必须使用诸如CRLF这样的分隔符,如http在请求头中所做的那样)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59228961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档