如何使用java中的socket编程发送多个图像并在服务器端的特定路径上写入?
我想在wifi的不同系统上从客户端向服务器端发送多个图像,并在服务器端的特定位置写入这些文件 提前感谢。在Client.java文件中如何使用java中的socket编程发送多个图像并在服务器端的特定路径上写入?,java,sockets,file-transfer,Java,Sockets,File Transfer,我想在wifi的不同系统上从客户端向服务器端发送多个图像,并在服务器端的特定位置写入这些文件 提前感谢。在Client.java文件中 public class Client { public void send(String file_name){ try { Socket socket = new Socket("IBM-PC", 3332); File file = new File(file_name);
public class Client {
public void send(String file_name){
try {
Socket socket = new Socket("IBM-PC", 3332);
File file = new File(file_name);
System.out.println(file_name);
ObjectInputStream ois = new ObjectInputStream(
socket.getInputStream());
ObjectOutputStream oos = new ObjectOutputStream(
socket.getOutputStream());
oos.writeObject(file.getName());
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[Server.BUFFER_SIZE];
Integer bytesRead = 0;
while ((bytesRead = fis.read(buffer)) > 0) {
oos.writeObject(bytesRead);
oos.writeObject(Arrays.copyOf(buffer, buffer.length));
}
ois = null;
oos = null;
} catch (Exception e) {
System.out.println(e);
}
}
public static void main(String[] args) throws Exception {
Client c = new Client();
c.send("D://1.jpg"); // first image path
c.send("D://0.jpg"); // second image path
}
}
在Server.Java文件中
public class Server extends Thread {
public static final int PORT = 3332;
public static final int BUFFER_SIZE = 500102;
@Override
public void run() {
try {
ServerSocket serverSocket = new ServerSocket(PORT);
while (true) {
Socket s = serverSocket.accept();
saveFile(s);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void saveFile(Socket socket) throws Exception {
ObjectOutputStream oos = new ObjectOutputStream(
socket.getOutputStream());
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
FileOutputStream fos = null;
byte[] buffer = new byte[BUFFER_SIZE];
// 1. Read file name.
Object o = ois.readObject();
if (o instanceof String) {
fos = new FileOutputStream("D:\\temp\\"+o.toString()); // Edit it for specific path
System.out.println("D:\\temp\\"+o.toString());
} else {
throwException("Something is wrong");
}
// 2. Read file to the end.
Integer bytesRead = 0;
do {
o = ois.readObject();
if (!(o instanceof Integer)) {
throwException("Something is wrong");
}
bytesRead = (Integer) o;
o = ois.readObject();
if (!(o instanceof byte[])) {
throwException("Something is wrong");
}
buffer = (byte[]) o;
// 3. Write data to output file.
fos.write(buffer, 0, bytesRead);
} while (bytesRead == BUFFER_SIZE);
System.out.println("File transfer success");
fos.close();
ois.close();
oos.close();
}
public static void throwException(String message) throws Exception {
throw new Exception(message);
}
public static void main(String[] args) {
new Server().start();
}
}
首先运行server.java文件,然后运行client.java文件
我希望它能帮助您……在
bytesRead!=缓冲区大小不正确。短读可以在任何时候发生,而不仅仅是在文件末尾。对于空数组,发送方应该发送一个零长度,以表示当前文件的结束。这段代码还写入了超出需要的数据。写入的字节数组应以bytesRead
为边界,而不是以buffer.length
为边界:并且,修复了这个问题后,您根本不需要显式地写入bytesRead
。