Hallo zusammen!
Ich arbeite gerade an einem kleinen Projekt in dem der Server dem Client ständig screenshots sendet und der Client diese auf einem JPanel darstellt.
Nun stehe ich vor einem Problem, da mein Programm keine Exceptions mehr wirft, es aber trotzdem nicht funktioniert.
Server/Host :
Ich denke bis hier hin ist alles richtig oder?
Und hier müsste irgendwo der Fehler liegen:
Frame:
Panel:
Ich denke es wäre zu viel verlangt wenn sich jemand durch den ganzen Code arbeiten soll, aber vielleicht erkennt einer die Struktur dahinter und erkennt darin schon einen Fehler
Danke schon mal!
Max
Ich arbeite gerade an einem kleinen Projekt in dem der Server dem Client ständig screenshots sendet und der Client diese auf einem JPanel darstellt.
Nun stehe ich vor einem Problem, da mein Programm keine Exceptions mehr wirft, es aber trotzdem nicht funktioniert.
Server/Host :
Java:
import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import javax.imageio.ImageIO;
public class Server {
private ServerSocket serverSocket;
private Socket clientSocket;
private DataOutputStream dout;
private Robot robot;
private int screenWidth, screenHeight;
public Server() {
startServer();
waitForClient();
sendScreenshots();
}
/**
* Starts the server on port 6493
*/
private void startServer() {
try {
serverSocket = new ServerSocket(6493);
} catch(IOException e) {
e.printStackTrace();
}
System.out.println("Server started...");
}
/**
* Waits for a client to connect
*/
private void waitForClient() {
try {
clientSocket = serverSocket.accept();
} catch(IOException e) {
e.printStackTrace();
}
try {
dout = new DataOutputStream(clientSocket.getOutputStream());
} catch(IOException e) {
e.printStackTrace();
}
System.out.println("Accepted client!");
}
/**
* Sends a png screenshot to the connected Client
*/
private void sendScreenshots() {
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
screenWidth = dim.width;
screenHeight = dim.height;
Rectangle screen = new Rectangle(screenWidth,screenHeight);
BufferedImage screenshot;
try {
robot = new Robot();
} catch (AWTException e) {
e.printStackTrace();
}
while(true) {
screenshot = robot.createScreenCapture(screen);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
ImageIO.write(screenshot, "png", baos);
} catch (IOException e) {
e.printStackTrace();
}
byte[] screenBytes = baos.toByteArray();
try {
dout.writeInt(screenBytes.length);
dout.write(screenBytes);
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* @param args
*/
public static void main(String[] args) {
new Server();
}
}
Ich denke bis hier hin ist alles richtig oder?
Und hier müsste irgendwo der Fehler liegen:
Java:
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.imageio.ImageIO;
public class Client {
private Socket socket;
private DataInputStream din;
private BufferedImage screenshot;
public BufferedImage getScreenshot() {
return screenshot;
}
public void connectToServer(String ip, int port) {
try {
socket = new Socket(ip,port);
din = new DataInputStream(socket.getInputStream());
} catch(UnknownHostException e) {
e.printStackTrace();
} catch(IOException e) {
e.printStackTrace();
}
}
public void getScreenshots() {
int length;
byte[] buffer;
while(true) {
try {
length = din.readInt();
buffer = new byte[length];
for(int i = 0; i < length; i++) {
buffer[i] = din.readByte();
}
ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
try {
screenshot = ImageIO.read(bais);
} catch (IOException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Frame:
Java:
import javax.swing.JFrame;
public class ClientGUI extends JFrame {
/**
*
*/
private static final long serialVersionUID = -3320531674461503451L;
private ClientGUIPanel panel;
public ClientGUI() {
initUI();
}
private void initUI() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setTitle("Remote screenshot");
setSize(600,600);
panel = new ClientGUIPanel();
add(panel);
setVisible(true);
}
/**
* @param args
*/
public static void main(String[] args) {
new ClientGUI();
}
}
Panel:
Java:
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
public class ClientGUIPanel extends JPanel
implements Runnable {
/**
*
*/
private static final long serialVersionUID = -7866627091470809232L;
private Client client;
private BufferedImage screenshot;
public ClientGUIPanel() {
client = new Client();
client.connectToServer("localhost", 6493);
client.getScreenshots();
Thread thread = new Thread(this);
thread.start();
}
@Override
public void paintComponent(Graphics g) {
g.drawImage(screenshot, 0, 0, null);
}
@Override
public void run() {
while(true) {
screenshot = client.getScreenshot();
repaint();
try {
Thread.sleep(10);
} catch(InterruptedException e) {
}
}
}
}
Ich denke es wäre zu viel verlangt wenn sich jemand durch den ganzen Code arbeiten soll, aber vielleicht erkennt einer die Struktur dahinter und erkennt darin schon einen Fehler
Danke schon mal!
Max