Avatar billede ladyhawke Novice
20. april 2001 - 15:05 Der er 4 kommentarer og
1 løsning

Opdater billed løbende

Jeg har en server applikation som opretter en \"client worker\" (anden klasse som håndterer indkomne klienter). client worker modtager en fil som skrives på HD (x.jpg)

problemet er at jeg gerne vil kunne vise billedet på skærmen (i \"frame\") hver gang der modtages et nyt billede fra klienterne...

Koden ser således ud:
import java.awt.Color;
import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;

import java.io.*;
import java.net.*;

import TableContainer;

class ClientWorker implements Runnable {
  private Socket client; 
     
  ClientWorker(Socket client) {
  this.client = client;     
  }

  public void run(){
    String line;
    int readValue;
    InputStream in = null;
    PrintWriter out = null;
    int fileSize = 0;
    try{
      in = client.getInputStream();       
      out = new PrintWriter(client.getOutputStream(), true);
    } catch (IOException e) {
      System.out.println(\"in or out failed\");
      System.exit(-1);
    }

    try{
      int c;
      int i = 0;             
      int count = 0;
         
      while (count < 4){
        c = in.read();
        fileSize += c<<i; // the received byte is multiplied with 2 to the i in order to convert from hex value
        i+=8;
        count++;
      }
      // just for verification
      System.out.println(\"file size: \" +  fileSize);    

      BufferedInputStream bin = new BufferedInputStream(in);
      FileOutputStream fo = new FileOutputStream(\"xxxx.jpg\", false);

      count = 0;
      c = bin.read();
      while ((count < fileSize) & (c != -1)){
        fo.write(c);
        count++;
        c = bin.read();
      }

      System.out.println(\"Bytes read \" + count);
      fo.flush();
      fo.close();
      in.close();

    } catch (IOException e) {
        System.out.println(\"Read failed\");
        System.exit(-1);
      }   
    }
  }

class SocketThrdServer extends JFrame implements ActionListener {
  JPanel serverInfo;
  JPanel panel;
  JLabel imageHost;      
  int serverPort;
  TextField portTF = new TextField(\"5555\",20);
   
  ServerSocket server = null;
 
  SocketThrdServer(){ //Begin Constructor
   
    JButton accept = new JButton(\"Accept Settings\");
    accept.addActionListener(this);         
   
    JLabel serport = new JLabel(\"Server Port:\");
    serport.setHorizontalAlignment(SwingConstants.RIGHT);
    serport.setForeground(Color.black);
    serport.setFont(new Font(\"Arial\", Font.BOLD, 13));
   
    TableContainer tc = new TableContainer(2,4);   

    tc.add(serport, 0, 0, 1, 1, TableContainer.CENTER, 10, 10);
    tc.add(portTF, 0, 1, 1, 1, TableContainer.CENTER, 10, 10);
    tc.add(accept, 0, 2, 1, 1, TableContainer.CENTER, 10, 10);

    serverInfo = new JPanel();
    serverInfo.add(tc);
   
    panel = new JPanel();
    panel.setLayout(new BorderLayout());
    panel.setBackground(Color.white);
    getContentPane().add(panel);
    panel.add(\"North\", serverInfo);       
  } //End Constructor

      public void actionPerformed(ActionEvent ae){
      if (ae.getActionCommand().equals(\"Accept Settings\")){
        serverPort = Integer.parseInt(this.portTF.getText());
        System.out.println(\"Server port: \" + serverPort);       
      }
    }

  public void listenSocket(){
    try{
      server = new ServerSocket(serverPort);
    } catch (IOException e) {
      System.out.println(\"Could not listen on port \" + serverPort);
      System.exit(-1);
      }

    while(true){
      ClientWorker w;
      try{
        w = new ClientWorker(server.accept());
        Thread t = new Thread(w);
        t.start();
      } catch (IOException e) {
        System.out.println(\"Accept failed: \" + serverPort);
        System.exit(-1);
        }
    }   
  }

  protected void finalize(){
//Objects created in run method are finalized when
//program terminates and thread exits
    try{
        server.close();
    } catch (IOException e) {
        System.out.println(\"Could not close socket\");
        System.exit(-1);
    }
}


  public static void main(String[] args){
        SocketThrdServer frame = new SocketThrdServer();
        frame.setTitle(\"Server Program\");
        WindowListener l = new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                        System.exit(0);
                }
        };
        frame.addWindowListener(l);
        frame.setSize(500,370);       
        frame.setVisible(true);
        frame.listenSocket();       
  }
}
Avatar billede thomaz Nybegynder
21. april 2001 - 19:52 #1
Lige en hurtig kommentar prøv engang at kigge på et Observer Pattern. Suns hjemmeside har både sourcekode og en god forklaring på dette 
Avatar billede ladyhawke Novice
25. april 2001 - 12:05 #2
Jeg har afprøvet det, men kan ikke få det til at virker fordi serveren er en multithreaded server...
Avatar billede ladyhawke Novice
21. maj 2001 - 15:34 #3
DEt virker nu, det var et cache problem
Avatar billede thomaz Nybegynder
21. maj 2001 - 17:12 #4
Cache problem, hvordan ? Sagen er den er jeg faktisk selv skal til at implementere noget a la ovenstående.
Avatar billede ladyhawke Novice
21. maj 2001 - 17:24 #5
I dette tilfælde skulle der hentes et billede fra HD, det hentet ind i en ImageIcon, men new imageIcon, men så bruger java en cached version af billedet og det bliver derfor ikke opdateret, men denne konstruktion virker:
  imageLabel.setIcon(new ImageIcon(Toolkit.getDefaultToolkit().createImage(\"xxxx.jpg\")));


hvor xxxx.jpg er det billede der indsættes. Du kan dog godt få problemer mht. tråde hvis du bruger en threaded server, men så skal du prøve at adskille GUI og server tråd, de kan let komme i konflikt
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester