【发布时间】:2015-05-16 20:29:12
【问题描述】:
我正在尝试将文件从客户端发送到服务器,但仅传输了约 8kb 的较大文件(约 100kb)。例如,png 并不完全可见。 我真的不知道为什么它会提前停止。
发送小测试文件(~1 kb)效果很好。
服务器部分:
ServerSocket fileSocket = new ServerSocket(p);
boolean rdy = false;
while (!rdy) {
Socket client = fileSocket.accept();
String fileName = "C:/" + args[2];
String cmd = fileName + "\n";
OutputStreamWriter sWriter = new OutputStreamWriter(client.getOutputStream());
sWriter.write(cmd, 0, cmd.length());
sWriter.flush();
InputStream inStream = client.getInputStream();
FileOutputStream fileStream = new FileOutputStream(fileName);
byte[] buffer = new byte[client.getReceiveBufferSize()];
int bytesRead = 0;
while ((bytesRead = inStream.read(buffer)) > 0) {
fileStream.write(buffer, 0, bytesRead);
}
fileStream.flush();
ta.append("File transfered");
inStream.close();
fileStream.close();
rdy = true;
}
fileSocket.close();
return;
客户端部分:
Socket client = new Socket(ip, port);
OutputStream outStream = client.getOutputStream();
FileInputStream fileStream = new FileInputStream(fileName);
byte[] buffer = new byte[(int) fileStream.getChannel().size()];
int bytesRead = 0;
System.out.println("Sending file: " + fileName);
while ((bytesRead = fileStream.read(buffer)) > 0) {
outStream.write(buffer, 0, bytesRead);
}
outStream.close();
fileStream.close();
client.close();
return;
【问题讨论】:
-
您正在向客户写一些东西,但从未阅读过它。试试不写。您可能会触发未告诉我们的连接重置。或者您有其他异常,请在您的问题中发布它和堆栈跟踪。
-
客户端这行
outStream.write(buffer, 0, bytesRead);不会造成数据丢失吗?难道写得比告诉的少吗? -
@alk 不,它会阻塞,直到所有数据都传输完毕。请参阅 Javadoc。
-
我在这里得到一个套接字异常(
java.net.SocketException: Connection reset at java.net.SocketInputStream.read(Unknown Source)):while ((bytesRead = inStream.read(buffer)) > 0) { fileStream.write(buffer, 0, bytesRead); } -
如预期的那样。那么当你在没有写入的情况下尝试它时发生了什么?
标签: java sockets client server