2013-08-18 221 views
2

我想制作一个小程序,为桌面制作实时流。 它应该是这样的,你发送图片到回声服务器,并将其响应给客户端。 你会得到图像。并排。所以它就像一部电影(或类似的东西)。 但我总是得到一个indexoutofboundsexception。错误在哪里,或者我该如何改进我的程序。indexoutofboundsexception通过套接字发送图片

的ImageIO.write线thows错误

//客户端主

公共类主要{

public static void main(String[] args) { 

    Frame frm = new Frame(); 

    Frame.Client client; 

    frm.setLayout(null); 
    frm.setDefaultCloseOperation(Frame.EXIT_ON_CLOSE); 
    frm.setResizable(false); 
    frm.setSize(1600,900); 
    frm.setVisible(true); 



} 

}

//获取并发送Desktopimage

public class desktopCapture {

Robot robo; 
BufferedImage screenImage; 
Rectangle bounding; 

public desktopCapture() { 
    try { 
     bounding = new Rectangle(0,0,1600,900); 
     robo = new Robot(); 
    } catch (AWTException e) {e.printStackTrace();} 
} 

public void sendScreenCapture(Socket client) { 
    screenImage = robo.createScreenCapture(bounding); 
    try { 
     ImageIO.write(screenImage, "png", client.getOutputStream()); 

    } catch (IOException e) {e.printStackTrace();} 
} 

}

//在帧中的两个功能ActionListener对象,所以我可以说谁流了桌面和只得到图像至。 公共无效readImage(){ 而(真){

  try { 
       while((screenImage = ImageIO.read(in)) != null){ 

        repaintScreen(); 

       } 
      } catch (IOException e) {e.printStackTrace();} 
     } 
    } 

公共无效sendImage(){

 try { 
      while(true){ 
      dC.sendScreenCapture(client); 
      System.out.println("read1"); 
      while((screenImage = ImageIO.read(in)) != null){ 
      System.out.println("read2"); 
      ImageIO.write(screenImage, "png", new File("image1.png")); 

      Thread.sleep(250); 
      } 
      repaintScreen(); 
      screenImage = null; 

      } 
      } catch (IOException | InterruptedException e) {e.printStackTrace();} 

    } 
    } 

} 

//线程的客户端

公共类处理程序实现Runnable {

Socket client; 
OutputStream out; 
InputStream in; 
PrintWriter writer; 
BufferedImage image; 

public handler(Socket client) { 
    this.client = client; 
} 

@Override 
public void run() { 

    try { 

     in = client.getInputStream();  
    BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
    while(true) { 
     System.out.println("write1"); 
     while((image = ImageIO.read(in)) != null){ 
      System.out.println("write2"); 
    for(int i = 1;i <= Server.connectionArray.size();i++){ 
     Socket TEMP_SOCK = (Socket)Server.connectionArray.get(i-1); 
    out = TEMP_SOCK.getOutputStream(); 
    writer = new PrintWriter(out); 

    ImageIO.write(image, "png", TEMP_SOCK.getOutputStream()); 
    System.out.println("write3"); 
     } 
     image = null; 
    } 
    } 

    } catch (IOException e) {e.printStackTrace();} 
} 

}

+0

哪行代码抛出异常?你是否用调试器遍历代码来确定代码为什么要访问超出范围的索引? –

+0

噢..对不起.. ImageIO.write线条很难相信 –

+0

。发布堆栈跟踪。 – EJP

回答

0

我想你for循环更改为:

int count = Server.connectionArray.size() 
int index = count - 1; 
for(int i = 0;i < count; i++){ 
     Socket TEMP_SOCK = (Socket)Server.connectionArray.get(index); 
     out = TEMP_SOCK.getOutputStream(); 
     writer = new PrintWriter(out); 

     ImageIO.write(image, "png", TEMP_SOCK.getOutputStream()); 
     System.out.println("write3"); 
    } 
+0

当我使用这个我得到一个IndexOutOfBoundsException通过套接字TEMP_SOCK =(套接字)Server.connectionArray.get(i); –

+0

@AlexanderKnotek请参阅编辑。 – BlackHatSamurai

+0

这种方式的工作原理现在仅仅是桌面捕捉左侧的indexoutofboundsexception。通过我的服务器,问题解决了我的想法。但客户端现在通过函数desktopCapture来解决问题。在imageIO.write(); –