2016-11-20 202 views
0

我想通过套接字发送一个wav文件。通过套接字发送wav文件

我得到的错误:

TypeError: must be string or buffer, not instance 

waveFile = wave.open(WAVE_OUTPUT_FILENAME, 'rb') 
my_socket.sendall(waveFile) 
+0

我上面写的代码,my_socket.send(),wavefile =开放(...)。 read() – user4719989

回答

0

wave不给你我一般的文件/ O。它用于获取媒体属性。

您可以使用正常打开/关闭,读/写。

sender.py:

import socket 

(HOST,PORT)=('localhost',19123) 
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); s.connect((HOST,PORT)) 

with open('input', 'rb') as f: 
    for l in f: s.sendall(l) 
s.close() 

receiver.py:

import socket 

(HOST,PORT) = ('localhost',19123) 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((HOST, PORT)); s.listen(1); conn, addr = s.accept() 

with open('output','wb') as f: 
    while True: 
    l = conn.recv(1024) 
    if not l: break 
    f.write(l) 
s.close() 
+0

客户代码: '而数据: ALLDATA + =数据 数据= client_socket.recv(1024) 声音=打开( “voice.p”,' WB ') voice.write(ALLDATA)' 提高我的错误-wave.Error:文件不以RIFF ID开头 – user4719989

+0

我将'send'改为'sendall'。前者不保证发送所有字节(并且需要重试剩余的字节)。后者发送所有字节。它不需要重试。 – blackpen

+0

在客户端,不要做字符串操作,比如'alldata + = data;'。我不认为他们在字节数组上安全。 – blackpen

0

尝试socket.sendfile(file, offset=0, count=None)

Send a file until EOF is reached by using high-performance os.sendfile

而且你不想打开该文件wave.open(...)为您发送原始二进制数据。

所以,你会怎么做:

with open(WAVE_OUTPUT_FILENAME, 'rb') as wave_file: 
    my_socket.sendfile(wave_file) 
+0

它引发了我的错误errorError:AttributeError:'_socketobject'对象没有属性'sendfile' – user4719989

+0

我正在使用windows ir其事物 – user4719989

+0

socket.sendfile()不会在Python 2.7中退出。 – blackpen