【问题标题】:indexoutofboundsexception by sending pictures over Socketindexoutofboundsexception 通过 Socket 发送图片
【发布时间】:2013-08-20 03:03:01
【问题描述】:

我想制作一个用于桌面直播的小程序。 应该是这样,您将图片发送到回显服务器,然后他将其响应给客户端。 在那里你可以绘制图像。并排。所以它就像一部电影(或类似的东西)。 但我总是得到一个 indexoutofbounds 异常。错误在哪里或如何改进我的程序。

ImageIO.write 行抛出错误

//客户端主

公共类主{

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);



}

}

// 获取并发送桌面图像

公共类桌面捕获{

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 对象的第二帧函数中,所以我可以说谁将他的桌面流式传输,哪些只将图像发送到。 公共无效读取图像(){ 而(真){

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

                    repaintScreen();

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

public void 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();}
}

}

【问题讨论】:

  • 哪一行代码抛出异常?您是否使用调试器单步执行代码以确定代码为何尝试访问超出范围的索引?
  • 哦 .. 抱歉 .. ImageIO.write 行会这样
  • 很难相信。发布堆栈跟踪。
  • 我不知道你到底是什么意思?

标签: java indexoutofboundsexception


【解决方案1】:

我会将您的 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");
  }

【讨论】:

  • 当我使用这个时,我通过 Socket TEMP_SOCK = (Socket)Server.connectionArray.get(i); 得到一个 IndexOutOfBoundsException;
  • 这种方式有效,现在 indexoutofboundsexception 仅由 desktopCapture 离开。通过我的服务器,我认为问题已解决。但是客户端现在通过函数 desktopCapture 遇到了问题。在 imageIO.write();
猜你喜欢
  • 2013-03-23
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 2020-07-25
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
相关资源
最近更新 更多