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();
}
}
