기본적으로 로봇을 사용하여 클라이언트에서 이미지를 가져 와서 몇 초마다 서버로 보내는 애플리케이션을 만들었 기 때문에 다른 PC에서 무슨 일이 일어나고 있는지 볼 수 있습니다. 문제는 이미지를 배열 등에 저장하는 것 같습니다. 몇 초 후에 충돌이 발생하기 때문입니다. 이미지를 받아 화면에 씁니다. 그러나 잠시 후 OutOfMemory를 제공합니다. 누구든지 원인에 대한 힌트가 있습니까?
요청 된 코드 스 니펫은 다음과 같습니다.
섬기는 사람:
private class Conexao extends Thread {
public static final int PORTA = 12000;
public ObjectOutputStream out;
public ObjectInputStream in;
public Image image;
private boolean fim;
public Conexao(String ip) throws IOException {
try {
Socket socket = new Socket(ip, Conexao.PORTA);
this.out = new ObjectOutputStream(socket.getOutputStream());
this.in = new ObjectInputStream(socket.getInputStream());
} catch (IOException e) {
throw e;
}
}
public void encerrar() {
this.fim = true;
}
@Override
public void run() {
this.fim = false;
while (!this.fim) {
Mensagem mensagem = null;
try {
mensagem = ((Mensagem) in.readObject());
} catch (IOException | ClassNotFoundException e) {
}
if (mensagem != null) {
this.image = mensagem.getImage();
Cliente.this.painel.repaint();
}
}
}
}
고객:
private static class Conexao extends Thread {
private static Image CURSOR;
static {
try {
CURSOR = ImageIO.read(new File("images\\mouse.png"));
} catch (IOException e) {
CURSOR = null;
}
}
private ObjectOutputStream out;
private ObjectInputStream in;
public Conexao() throws IOException {
try {
ServerSocket serverSocket = new ServerSocket(Servidor.PORTA, 1);
Socket socket = serverSocket.accept();
this.out = new ObjectOutputStream(socket.getOutputStream());
this.in = new ObjectInputStream(socket.getInputStream());
} catch (IOException e) {
throw e;
}
}
@Override
public void run() {
try {
Robot robot = new Robot();
for (;;)
try {
Thread.sleep(10);
Point p = MouseInfo.getPointerInfo().getLocation();
BufferedImage img = robot.createScreenCapture(new Rectangle(0, 0, Toolkit.getDefaultToolkit().getScreenSize().width, Toolkit.getDefaultToolkit().getScreenSize().height));
if (Conexao.CURSOR != null) {
img.getGraphics().drawImage(CURSOR, p.x, p.y, null);
} else {
Graphics2D g = (Graphics2D) img.getGraphics();
g.setColor(Color.WHITE);
g.fillOval(p.x - 5, p.y - 5, 10, 10);
g.setStroke(new BasicStroke(2));
g.setColor(Color.BLACK);
g.drawOval(p.x - 5, p.y - 5, 10, 10);
g.dispose();
}
this.out.writeObject(new Mensagem(img, p));
this.out.flush();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
} catch (AWTException e) {
}
}
}
호출 시도 this.out.reset();
후 this.out.flush();
.
이것은 ( Serialization FAQ 및 이 사이트에 따라 ) 반복 된 객체가 캐시 참조로 최적화 될 수 있도록 기록 된 모든 객체의 캐시를 유지하는 ObjectOutputStream 의 문제인 것 같습니다 . 또한 개체를 다시 보내기 전에 개체의 값이 변경되지만 캐시 된 개체가 이전 값을 유지하는 경우에도 문제가 발생할 수 있습니다. 두 경우 모두 전화 로 문제가 해결됩니다. 안타깝게도 클래스 문서에는 이에 대한 설명이 없습니다.reset()
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다