目前正在尝试让服务器向客户端发送文件。
我能够在客户端目录中看到正在创建的文件,但它不会发送所有字节。有时它的90%的字节,有时甚至不到10个字节。
我不断从终端窗口收到一条消息:“字节周围的输入格式错误......”
以下是此部分的服务器代码:
String cMessage;
DataInputStream input= new DataInputStream( remote_socket.getInputStream() );
File filename = new File(cMessage);
try {
input = new DataInputStream(new FileInputStream(filename));
DataOutputStream out = new DataOutputStream(remote_socket.getOutputStream());
byte[] buffer = new byte[(int) filename.length()];
int count;
while((count = input.read(buffer)) >0){
out.write(buffer, 0, count);
}
System.out.println("Sending " + cMessage + " that is " + filename.length());
out.flush();
} catch (IOException e) {
System.out.println(e + "......");
e.printStackTrace();
}
运行时服务器的输出如下所示: 发送test.png为723915
以下是此部分的客户端:
try {
BufferedReader reader= new BufferedReader(
new InputStreamReader(System.in) );
String message;
BufferedReader fileMessageReader= new BufferedReader(
new InputStreamReader(System.in) );
String fileMessage;
DataOutputStream output= new DataOutputStream(this.client_socket.getOutputStream() );
DataInputStream input = new DataInputStream(this.client_socket.getInputStream());
while(true) {
while( (message = reader.readLine()) != null ) {
System.out.println("1. For a text message. 2. For a file");
if (message.equals("2")) {
System.out.println("Name of file?");
fileMessage = fileMessageReader.readLine();
output.writeUTF(fileMessage);
try {
File filename = new File(fileMessage);
DataOutputStream fileOutput = new DataOutputStream(new FileOutputStream(filename));
byte[] buffer = new byte[1024];
int count;
while((count = input.read(buffer)) >0){
fileOutput.write(buffer, 0, count);
}
fileOutput.flush();
fileOutput.close();
} catch (IOException e) {
System.out.println(e + "...");
}
} else {
output.writeUTF( message );
}
}
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
答案 0 :(得分:0)
while ((c = input.read()) != -1) {
output.write(c);
}
这件作品正在扼杀它。如果您仔细阅读javadoc,而不是仅仅检查方法签名,您将看到read()
从输入中读取单个byte
(它返回int
仅为了能够发出流的结束信号与-1
)。所以你将byte
看作int
,没什么大不了的,但是你盲目地将前面提到的int
(4个字节)写入输出流。
您应该使用read(byte[] b)
代替然后编写整个数组(或者只是在上一轮中读取的部分数组)。