네트워크를 통해 지정된 디렉토리에 이미지 파일을 보낼 기본 클라이언트 서버를 만들었습니다. 이 코드는 지난 주에 작동했지만 오늘 다시 돌아 왔으며 클라이언트가 디렉토리에있는 모든 이미지 파일을 보냈음에도 불구하고 서버 측에서 하나의 파일 만 가져 오는 것으로 보입니다. 그것은 클라이언트 코드에서 뭔가있을 수 있지만 그것은 서버 쪽에서 뭔가라고 생각합니다. 도움을 주시면 대단히 감사 드리며보다 효율적인 솔루션을 보유하고 계시다면 필자는 필요에 따라 코드를 변경해 드리겠습니다. 내 코드는 다음과 같습니다 :객체 입력 스트림은 네트워크를 통해 하나의 파일 만 가져오고 있습니까?
ImageServer와
package com.encima.network.server;
import java.io.*;
import java.net.*;
public class ImageServer{
ServerSocket ss;
Socket s;
ObjectOutputStream oos;
int port = 4440;
public ImageServer() throws IOException {
try {
ss = new ServerSocket(port);
System.out.println("Server started on Port: " + port);
} catch(IOException e) {
System.out.println("Serevr: Port-" + port + " not available, exiting.");
System.exit(0);
}
System.out.println("Server: Waiting for Client Connection...");
while(true) {
try {
s = ss.accept();
new ImageHandler(s);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException {
ImageServer is = new ImageServer();
}
}
ImageHandler
package com.encima.network.server;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.net.Socket;
import javax.imageio.ImageIO;
public class ImageHandler implements Runnable {
Socket s;
int count = 0;
public ImageHandler(Socket socket) {
s = socket;
Thread t = new Thread(this);
t.start();
}
@Override
public void run() {
try {
ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
FileOutputStream fos = new FileOutputStream("image" + System.nanoTime() + ".jpg");
count++;
//BufferedImage in = ImageIO.read(ois);
//ImageIO.write(in, "jpg", fos);
int ch = 0;
while(true) {
ch = ois.read();
if(ch == -1) {
break;
}
fos.write(ch);
}
fos.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Finally, the ImageClient
package com.encima.network.client;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import javax.imageio.ImageIO;
import com.encima.network.ImageFilter;
public class ImageClient {
Socket s;
String ip = "localhost";
int port = 4440;
ObjectOutputStream oos;
public ImageClient(File[] files) throws IOException, ClassNotFoundException, InterruptedException {
try {
s = new Socket(ip, port);
System.out.println("Client connected to Server via " + ip + " on port 80");
} catch (Exception e) {
System.out.println("Client: Cannot find Host: " + ip + ". Exiting.");
System.exit(0);
}
oos = new ObjectOutputStream(s.getOutputStream());
for(File f: files) {
sendFile(f);
}
oos.close();
//System.out.println("Written Image " + i + " of " + files.length);
}
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
File dir = new File("/Users/christophergwilliams/Dropbox/PhD/Projects/PhD/Year 1/GSN/images");
File[] files = dir.listFiles(new ImageFilter());
ImageClient ic = new ImageClient(files);
}
public void sendFile(File file) throws IOException {
FileInputStream fis = new FileInputStream(file);
//BufferedImage b = ImageIO.read(file);
//ImageIO.write(b, "jpg", oos);
int ch = 0;
while(true) {
ch = fis.read();
if(ch == -1) {
break;
}
oos.write(ch);
}
oos.flush();
System.out.println("Image Sent");
}
}
나는 그것을 통해 읽을 수있는 코드의 많은 것을 알고하지만 난 이것에 얻을 수있는 모든 도움을 주셔서 감사 해!
효율성 및 네트워크 트래픽을 위해 이미지를 클라이언트에서 서버로 보내는 것이 좋을까요?
을 그래서, 당신은 같은 것을 사용하는 것이 좋습니다 것입니다 BufferedOutputStream 대신에? –
다른 연결에서 파일을 보내는 것에 관해서는 각 파일에 대해 새로운 출력 (및 입력) 스트림을 만드는 것만으로도 될까요? –
@Christopher : 매번 다른 소켓을 사용하여 연결해야합니다. 'BufferedOutputStream'이 필요한지에 관해서는 ... 개인적으로 당신이 필요하다고 느낄 때까지 명시적인 버퍼링을 추가하지 않아도됩니다. 내 요점은'Object * Stream'을 없애는 것이 었습니다. 당신에게 아무런 효과가 없으며 실제로 객체를 쓰고 있다는 가독성을 해치고 있습니다. –