私は、ネットワークを介して指定されたディレクトリに画像ファイルを送る基本的なクライアントサーバを作成しました。コードは先週働いていましたが、私は今日それに戻ってきました。クライアントがディレクトリ内のすべてのイメージファイルを送信したことを印刷しても、サーバー側で1つのファイルしか取得していないようです。 それはクライアントコードの中にあるかもしれませんが、私はそれがサーバー側の何かだと思います。 ご協力いただきまして誠にありがとうございます。より効率的なソリューションをお持ちの場合は、必要に応じてコードを変更させていただきます。私のコードは以下の通りです:オブジェクト入力ストリームはネットワーク経由で1つのファイルしか取得できませんか?
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'を取り除くことでした(オブジェクトを実際に書き出していることを示唆して読みやすさに害を与えています)。 –