Java 无法通过android中的套接字发送多个文件
我正在尝试将音频录制到服务器端的一个文件中,这是一个android设备,录制完成后将其发送到另一个android设备客户端。它第一次工作正常,但当我再次录制时,客户端没有收到我的第二条记录。这是我的密码 服务器线程:Java 无法通过android中的套接字发送多个文件,java,android,sockets,io,Java,Android,Sockets,Io,我正在尝试将音频录制到服务器端的一个文件中,这是一个android设备,录制完成后将其发送到另一个android设备客户端。它第一次工作正常,但当我再次录制时,客户端没有收到我的第二条记录。这是我的密码 服务器线程: public class ServerThread implements Runnable { public void run() { try { if (SERVERIP != null) { se
public class ServerThread implements Runnable {
public void run() {
try {
if (SERVERIP != null) {
serverSocket = new ServerSocket(SERVERPORT);
while (true) {
client = serverSocket.accept();
OutputStream out = client.getOutputStream();
while(true){
//record status is true
//when record is done
if(record_status){
try {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File(mFileName)));
BufferedOutputStream bout = new BufferedOutputStream(out);
copyFile(bis, bout);
bout.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
record_status = false;
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
客户端线程:
public class ClientThread implements Runnable {
public void run() {
try {
InetAddress serverAddr = InetAddress.getByName(SERVERIP);
Socket socket = new Socket(serverAddr, SERVERPORT);
connected = true;
while (connected) {
try {
dis = socket.getInputStream();
while(true){
if(dis.available()>0){
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(mFileName)));
copyFile(socket.getInputStream(), bos);
bos.flush();
//file has been received
//start playing the audio
startPlaying();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
socket.close();
} catch (Exception e) {
connected = false;
}
}
}
方法复制文件:
public static boolean copyFile(InputStream inputStream, OutputStream out) {
byte buf[] = new byte[4092];
int len;
try {
while ((len = inputStream.read(buf)) != -1) {
out.write(buf, 0, len);
}
out.close();
inputStream.close();
} catch (IOException e) {
return false;
}
return true;
}
这真的应该是一个评论,但我还没有代表。但在我看来,在服务器端,您在while循环的第一次迭代中将record_status设置为true,一旦该流被发送到客户端,则record_status设置为false,并且在while循环中不再实际设置为true。因此,if语句中的代码将不再执行。那么,记录状态在哪里再次设置为true呢?检查服务器端设备上的logcat,查看是否有任何内容实际放入比特流进行第二次录制,如果没有,这是您的问题record_状态设置为true每次我停止录制时,private void stopRecording(){mRecorder.stop();mRecorder.release();record_status=true;}这到底在哪里?它不在任何张贴的代码中吗?您是如何执行ServerThread的(是在调用stopRecording的同一个线程中)?您是否按照建议检查了logcat,以查看您的服务器是否确实在为第二次录制发送任何数据?因为我怀疑它是我用来录制和播放的,所以服务器会录制,当录制停止时,会调用stopRecording()方法,其中record_status设置为true,它会将文件发送给客户端,客户端会播放收到的文件。@kader LogCat您知道这是什么吗?正在发送第二个文件吗。。。你所说的正在发生,显然不是,否则它会起作用!您链接的代码甚至不包含record_状态变量,而是要在一台机器上以一个线程的方式执行。你怎么称呼你的服务器线程?如果看不到你的代码或logcat输出,我无法帮助你,我肯定不会为你编写应用程序发布一些logcat结果,或你的实际代码(不是谷歌的,你正在尝试修改)