我正在尝试为我的命令行服务器创建一个 gui 客户端。但是,我遇到了一些我似乎无法解决的烦人问题。
我不是 100% 确定实际问题是什么,因为有时代码会起作用,有时则不会。我认为主要问题是最初我尝试了
while 1:
self.data = s.recv(1024)
if not self.data():
break
else:
print self.data()
Run Code Online (Sandbox Code Playgroud)
然后我用这个发送给它
for f in files:
s.send(f)
Run Code Online (Sandbox Code Playgroud)
每个 f 都是一个文件名字符串。我希望它会在 recv 端出现,因为每个 recv 调用都会收到一个文件名,但在一次 recv 调用中,我得到了一大块文件名,我认为 1024 个字符值得
这使得无法检查数据的结尾,因此循环从未退出。
这是我现在的代码
def get_data(self,size = 1024):
self.alldata = ""
while 1:
while gtk.events_pending():
gtk.main_iteration()
self.recvdata = self.s.recv(size)
self.alldata += self.recvdata
if self.alldata.find("\r\n\r\nEOF"):
print "recieved end message"
self.rdata = self.alldata[:self.alldata.find("\r\n\r\nEOF")]
break
print "All data Recieved: " + str(len(self.rdata)) + "Bytes"
print "All data :\n" + self.rdata …Run Code Online (Sandbox Code Playgroud) 要读取 PNG 文件的字节,我想创建一个名为 的函数read_8_bytes,每次调用该函数时都会读取文件中接下来的 8 个字节。
fn main(){
let png = File::open("test.png").expect("1");
let mut png_reader = BufReader::new(png);
let mut byteBuffer: Vec<u8> = vec![0;8];
png_reader.read_exact(&mut byteBuffer).expect("2");
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,如果我继续read_exact从 main 调用,我可以读取接下来的 8 个字节。我尝试创建一个函数来执行此操作,但解决方案似乎不必要地复杂。我想知道是否有更好的方法。
我以为我必须将 BufReader 传递给该函数,但由于 Rust 的工作原理,这使事情变得复杂,我最终发现我需要做类似的事情:
fn read_eight_bytes<R: BufRead>(fd: &mut R)
Run Code Online (Sandbox Code Playgroud)
这可以编译,但我不高兴,因为我不明白为什么需要这样做并且看起来很复杂。有没有一种简单的方法可以让我可以将文件描述符类型的东西传递给函数并让它像 C 中那样存储位置而不必这样做?