想着用java的网络编程,客户端先发送文件,服务端接收,客户端在发送一条语句,服务端已接受
但结果是文件没有完全接受(已保存,但是打不开),语句发出去却显示null
服务端代码
package Test;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Test_Server {
public static void main(String[] args) throws IOException {
ServerSocket sockets=new ServerSocket(8899);
Socket socket = sockets.accept();
BufferedInputStream bufferedInputStream = new BufferedInputStream(socket.getInputStream());
FileOutputStream fileOutputStream = new FileOutputStream("D:\\null2.jpg");
int i=0;
byte[] bytes=new byte[1024];
while((i=bufferedInputStream.read(bytes))!=-1){
fileOutputStream.write(bytes,0 ,i);
}
System.out.println("已接受文件");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String s = bufferedReader.readLine();
System.out.println(s);
// BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(socket.getOutputStream());
// bufferedOutputStream.write("copyRightNow".getBytes());
// bufferedOutputStream.close();
bufferedReader.close();
fileOutputStream.close();
bufferedInputStream.close();
}
}
客户端
package Test;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class Test_Client {
public static void main(String[] args) throws IOException {
Socket socket=new Socket(InetAddress.getLocalHost(),8899);
OutputStream outputStream = socket.getOutputStream();
BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(outputStream);
//
//
byte[] bytes=getBytes();
bufferedOutputStream.write(bytes);
System.out.println("已发送文件");
//发送语句
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
bufferedWriter.write("helloWorld");
bufferedWriter.newLine();
bufferedWriter.flush();
socket.shutdownOutput();
System.out.println("已发送语句");
bufferedWriter.close();
socket.close();
}
//获取二进制文件保存在bytes数组中
public static byte[] getBytes() throws IOException {
File file = new File("D:\\null.jpg");
FileInputStream fileInputStream = new FileInputStream(file);
int len=(int)file.length();
byte[] bytes=new byte[len];
int readLine;
while((readLine= fileInputStream.read(bytes))!=-1){}
fileInputStream.close();
return bytes;
}
}
针对这个问题,我建议采用以下优化方案:
以下是Java代码示例:
// 客户端发送文件
File file = new File("path/to/file");
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
// 先发送文件长度
dos.writeLong(file.length());
// 再发送文件内容
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
byte[] buffer = new byte[4096];
int len;
while ((len = bis.read(buffer)) > 0) {
dos.write(buffer, 0, len);
}
dos.flush();
// 关闭流
bis.close();
fis.close();
dos.close();
Socket.shutdownOutput()
方法关闭输出流,以确保服务端能够及时收到文件并进入下一步处理。以下是Java代码示例:
// 客户端发送完文件后关闭输出流
socket.shutdownOutput();
PrintWriter
来发送字符串,并且需要在字符串前面添加一个长度,以便服务端能够正确接收字符串。在服务端接收字符串时,根据前面添加的长度来读取相应长度的字符串内容。以下是Java代码示例:
// 客户端发送字符串
String msg = "Hello World";
PrintWriter pw = new PrintWriter(socket.getOutputStream());
// 先发送字符串长度
pw.println(msg.length());
// 再发送字符串内容
pw.println(msg);
pw.flush();
// 关闭流
pw.close();
// 服务端接收字符串
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 读取字符串长度
int len = Integer.parseInt(br.readLine());
// 读取字符串内容
char[] buffer = new char[len];
br.read(buffer, 0, len);
String msg = new String(buffer);
// 关闭流
br.close();
希望以上优化方案能够帮助您解决问题。