【发布时间】:2023-03-13 02:40:01
【问题描述】:
我有 2 台设备通过 Socket 连接
服务器代码 -(Android 应用):
log("sending song to client - " + clientSocket.getInetAddress().toString());
InputStream fileInputStream = new FileInputStream(songFile);
socketDataOutputStream.writeLong(songFile.length());
Thread.sleep(50);
byte[] byteBuffer = new byte[16 * 1024];
int count;
while ((count = fileInputStream.read(byteBuffer)) > 0) {
socketDataOutputStream.write(byteBuffer, 0, count);
}
log("song sent to client - " + clientSocket.getInetAddress().toString());
socketOutputStream.flush();
log("sending a message to client - " + clientSocket.getInetAddress().toString());
socketDataOutputStream.writeUTF("play");
log("message sent to client - " + clientSocket.getInetAddress().toString());
客户端代码 -(PC 代码):
OutputStream fos = new FileOutputStream(song);
InputStream sis = socket.getInputStream();
DataInputStream dis = new DataInputStream(new BufferedInputStream(sis));
long size = dis.readLong();
int count;
log ("Receiving file");
while (size > 0 && (count = dis.read(buffer, 0, (int) Math.min(buffer.length, size))) != -1) {
fos.write(buffer, 0, count);
size = size - count;
}
fos.close();
log ("File received");
String s;
while ((s = dis.readUTF()) != null) {
log(s);
}
歌曲被成功接收,但之后无法与套接字通信!我尝试了不同的方法 - PrintWriter、write(bytes[])。什么都没有发生 - 客户端代码没有进入第二个 while 循环。
我不明白我做错了什么。
【问题讨论】:
-
你关闭
socketOutputStream了吗?如果不是,readUTF()怎么知道你是否要发送更多数据,只是速度很慢? -
你能解释一下你的评论吗?
-
嗯...对不起,我可能是对的,但也可能是错的。服务器不会关闭流,因此不会向客户端发送流结束信号,它只会坐在那里等待更多数据。但是,您从哪里得到
readUTF()会返回null的想法? javadoc 并没有说这是可能的。它实际上说,流结束将导致EOFException。由于您也不明白,我的第一个观察结果似乎是正确的:该方法正在等待更多数据。 -
它必须等待更多数据。之前的 songFile 发送成功,客户端也记录了“File Received”,所以之后它读取了更多的数据,服务器正在为其提供更多的数据。有什么问题?
-
@Andreas 他不需要刷新任何东西,除非堆栈中有
BufferedOutputStream。
标签: java android sockets outputstream