Estou usando os seguintes códigos para o envio de uma imagem por sockets java:
Código Servidor: O método é executado por uma thread
@Override
public void run() {
init = true;
while (init) {
try {
final Socket socket = server.accept();
Host host = controleServico.getServico().getHost();
String fileName = host.getHostname() + host.getUsername().toUpperCase()
+ "_to_" + socket.getInetAddress().getCanonicalHostName();
final File file = new File(fileName + ".jpg");
PrintScreen.setPrintFile(PrintScreen.getPrintScreen(), file, PrintScreen.TIPO_IMAGEM.JPG);
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Enviando arquivo: " + file.getAbsolutePath());
byte[] mybytearray = new byte[(int) file.length()];
BufferedInputStream bis;
try {
//System.out.println("enviar tamanho do arquivo " + (int)file.length());
//socket.getOutputStream().write((int)file.length());
//socket.getOutputStream().flush();
System.out.println("enviado " + (int)file.length());
bis = new BufferedInputStream(new FileInputStream(file));
bis.read(mybytearray, 0, mybytearray.length);
OutputStream os = socket.getOutputStream();
os.write(mybytearray, 0, mybytearray.length);
os.flush();
System.out.println("arquivo enviado");
} catch (FileNotFoundException ex) {
Logger.getLogger(PrintScreenServer.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(PrintScreenServer.class.getName()).log(Level.SEVERE, null, ex);
}finally{
try {
socket.close();
} catch (IOException ex) {
Logger.getLogger(PrintScreenServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}).start();
} catch (IOException ex) {
Logger.getLogger(PrintScreenServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Código Cliente:
Timer.executarApos(100, new Runnable() {
@Override
public void run() {
Socket sock;
try {
sock = new Socket(e.getHost().getIp(), PORTA_SERVER_PRINTS);
ControleCentral.setLog("print " + e.getNomeQualificado());
//int bytes = sock.getInputStream().read();
//ControleCentral.setLog("quantidade de bytes " + bytes);
byte[] mybytearray = new byte[200100];
InputStream is = sock.getInputStream();
FileOutputStream fos = new FileOutputStream(Monitoramento.getNomeFileScreen(e));
BufferedOutputStream bos = new BufferedOutputStream(fos);
int bytesRead = is.read(mybytearray, 0, mybytearray.length);
int current = 0;
bos.write(mybytearray, 0, bytesRead);
current = bytesRead;
do {
bytesRead = is.read(mybytearray, current, (mybytearray.length - current));
if (bytesRead >= 0) {
current += bytesRead;
}
} while (bytesRead > -1);
bos.write(mybytearray, 0, current);
bos.flush();
bos.close();
sock.close();
BufferedImage bi = ImageIO.read(new File(Monitoramento.getNomeFileScreen(e)));
BufferedImageSeriolizable bis = new BufferedImageSeriolizable(bi);
e.setScreenImage(bis);
Monitoramento.exibirPrintScreen(e, ControleMonitoramentoPorImagens.getPainel(e));
ControleCentral.setLog("print ok " + e.getNomeQualificado());
} catch (UnknownHostException ex) {
Logger.getLogger(Monitoramento.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Monitoramento.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
Porem, vejam o que acontece com a imagem recebida no cliente, e o tamanho dela é maior do que a enviada pelo servidor. Não sei como identificar e corrigir o problema, alguém tem alguma sugestão?