私のプロジェクトクライアントでは、いくつかのテキストといくつかの画像をサーバーに送信します。サーバーはこれらすべてを処理する必要があります。つまり、テキストが存在する場合はフレーム上にあるTestAreaに表示する必要があり、画像ファイルが存在する場合はサーバーはその画像ファイルをコンピューターに保存する必要があります。文字列(テキスト)または画像ファイルのいずれかを処理する1つのアプリケーションを作成しましたが、これらがクライアントから同時に送信されるときに、これらすべてを保存する方法がわかりません。
このコードを追加すると、次のようになります 。InputStream in = socket.getInputStream();
クライアントから送信されるすべてのデータはこのInputStreamにあります。 したがって、これまでの範囲のデータを識別する方法は画像ファイルであるため、バイト配列に格納する必要があります。これまではテストまたは文字列であるため、TextAreeaで表示する必要があります。クライアントが一度に2つ以上の画像をサーバーに送信する場合、サーバーがこの量のデータまでこれが最初の画像であり、これまでの量のデータまでこれが2番目の画像ファイルであることをサーバーがどのように理解するか。
私は画像を送信するためにこのコードを試しました:
クライアントコード:
public void sendPhotoToServer(String str){ // str is image location
try {
InputStream input = new FileInputStream(str);
byte[] buffer=new byte[1024];
int readData;
while((readData=input.read(buffer))!=-1){
dos.write(buffer,0,readData); // dos is DataOutputStream
}
} catch (FileNotFoundException e) {
} catch (IOException e) {
}
}
このメソッドはループ内にあるため、クライアントは自分のフォルダー内のすべての画像を送信します。
サーバーコードです。これはスレッド内にあり、whileループがあり、毎回クライアントデータをリッスンします。
public void run() {
while (true) {
try {
byte[] buffer = new byte[8192];
fis = new FileOutputStream("C:\\"+(s1++)+".jpg"); // fis is FileOutputStream
while ((count = in.read(buffer)) > 0){ //count is a integer and 'in' is InputStream
fis.write(buffer, 0, count);
fis.flush();
}
} catch (Exception e) {}
}
}
ただし、このコードでは、最初の画像がサーバーによって受信され、その後、他の画像は表示されません。
ここでは、単純な文字列がクライアントによって送信されたかどうかをサーバーがどのように理解するかを示します。サーバー側のアプリケーションでは、1つのポートを開いて、クライアントから送信されたすべてのデータをリッスンします。
FileOutputStream fis = socket.getInputStream();
これらすべてのファイルと単純な文字列をどのように区別するかを説明します。