我正在开发一个基于套接字的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(未知来源)
at com.sun.imageio.stream.StreamCloser $ CloseAction.performAction(Unknown Source)
在com.sun.imageio.stream.StreamCloser $ 1.run(未知来源)
在java.lang.Thread.run(未知来源)
的更新:
实际上我甚至在连接建立导致错误之前就关闭了套接字。 Else Nick的代码工作正常。
答案 0 :(得分:1)
因为目前还不清楚,我想确保你已经生成了ImageIO.read
调用正在运行的新线程;该行可能会阻塞该线程,直到发送一些内容供它读取。您不希望在EDT上执行此操作。
假设您有,我建议您使用SwingUtilities.invokeLater
来更新GUI。这是标准流程 - 它的作用是将更新放入队列中,因此下次GUI想要更新时,它知道该怎么做。
总而言之,您的代码看起来应该是这样的:
Thread awesomeThread = new Thread(new Runnable(){
@Override
public void run() {
while(true){
try{
//Read the image
final Image img = ImageIO.read(socket.getInputStream());
System.out.println("Image Read"); //code for troubleshooting
//Once an image is read, notify the GUI to update
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
ImageIcon icon = new ImageIcon(img);
label.setIcon(icon);
System.out.println("Image updated"); //code for troubleshooting
}});
} catch (IOException e) {}
}
}});
awesomeThread.start();