【发布时间】:2014-02-12 12:41:42
【问题描述】:
我正在开发一个基于套接字的 java 应用程序。它获取客户端的屏幕并将其显示在服务器上的 GUI 中。但问题是它只是在程序运行时显示客户端的屏幕开始,不要改变它。这是我的代码 服务器端:
try {
img = ImageIO.read(socket.getInputStream());
while(true){
ImageIcon icon = new ImageIcon(img);
label.setIcon(icon);
}
}
catch (IOException e) {}
客户端:
public class Client{
public static void main(String[] args) throws Exception{
BufferedImage screenShot = new Robot().createScreenCapture(new
Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
ImageIO.write(screenShot, "PNG", socket.getOutputStream());
public static void main(String[] args) throws Exception{
Socket socket = new Socket("localhost",1999);
Chat chat = new Chat(socket);
Thread thread = new Thread(chat);
thread.start();
}
}
class Chat implements Runnable{
private Socket socket;
public Chat(Socket socket){
this.socket = socket;
}
@Override
public void run() {
// TODO Auto-generated method stub
try{ while(true){
BufferedImage screenShot = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
ImageIO.write(screenShot, "PNG", socket.getOutputStream());
}}catch(Exception e){}
}}
错误:-
线程“Thread-3”中的异常 java.lang.IndexOutOfBoundsException
在 javax.imageio.stream.FileCacheImageOutputStream.seek(未知来源)
在 javax.imageio.stream.FileCacheImageOutputStream.close(Unknown Source)
在 com.sun.imageio.stream.StreamCloser$CloseAction.performAction(Unknown Source)
在 com.sun.imageio.stream.StreamCloser$1.run(未知来源)
在 java.lang.Thread.run(未知来源)
更新:
实际上,我什至在连接建立之前就关闭了导致错误的套接字。 Else Nick 的代码运行良好。
【问题讨论】:
-
您只读取和写入图像一次?循环执行! (在服务器端循环移动 imageio.read,在客户端完整的截屏功能!)。也许在一个 5 秒的计时器中
-
你的意思是我应该在客户端文件中添加 While(true) 循环?
-
是的,否则你只上传一张截图,因为代码只执行一次。在服务器上,您必须更频繁地读取套接字(创建一个 5 秒左右的计时器......)。
-
好的,我尝试在客户端添加循环。但它仍然没有改变。并且我得到了计时器部分?
-
您还可以在服务器端循环读取它。我刚刚提到,如果不是每 5 秒发送一次图像而不是淹没它不是更好。如果您不实施限制,它将产生大量流量。 (也许看看共同的客户端-服务器架构,以了解它是如何工作的以及如何获得发送-接收的最佳方式)。
标签: java swing sockets screenshot