缓冲区 IO 上的空指针异常



对于我的软件工程课程,我的小组必须从服务器获取相机流,并通过套接字将其发送到客户端。 我们通过不断通过套接字发送图像来做到这一点。 当我们尝试运行程序时,我们只得到一个图像,但下一个图像显示为空,因此我们得到一个空指针异常。

下面是 UserClient 类。 用户客户端接收一系列图像。 空指针出现在运行方法中,我用注释标记了它。

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package communication;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.net.ConnectException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JOptionPane;
import userpc.RoverGUI;
/**
 * A simple Swing-based client for the capitalization server. It has a main
 * frame window with a text field for entering strings and a textarea to see the
 * results of capitalizing them.
 */
public class UserClient extends Thread{
    //ObjectInputStream input;
    Socket s = null;
    boolean done = false;
    String serverAddress;
    RoverGUI gui;
    public static void main(String[] args){
        String serverAddress = JOptionPane.showInputDialog(
                "Enter IP Address of a machine that isn"
                + "running the date service on port 9090:");
        try {
            UserClient c = new UserClient(null, serverAddress);
        } catch (IOException ex) {
            Logger.getLogger(UserClient.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    public UserClient(RoverGUI gui, String serverAddress) throws UnknownHostException, IOException{
        this.gui=gui;
        this.serverAddress=serverAddress;
    }
    @Override
    public void run(){
        while (!done) {
            try {
                if (serverAddress.equals("")) {
                    throw new UnknownHostException();
                }
                s = new Socket(serverAddress, 9090);
                //input =new ObjectInputStream(s.getInputStream());
                done = true;
            } catch (ConnectException e) {
                gui.display("Wait for servor...");
            } catch (UnknownHostException ex) {
                gui.display("Un known Host Exception Occur...");
            } catch (IOException ex) {
                Logger.getLogger(UserClient.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        while(true){
            try {
                    gui.setIcons(ImageIO.read(ImageIO.createImageInputStream(s.getInputStream())),null);
//NULL POINTER HERE
                //System.out.println(input.readLine());
            } catch (IOException ex) {
                Logger.getLogger(UserClient.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    public void close() throws IOException {
        //input.close();
        s.close();
    }
}

漫游服务器发送图像流。

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package communication;
import camera.ImageBuffer;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
 *
 * @author junxin
 */
public class RoverServer implements Runnable {
    Socket socket = null;
    ServerSocket listener = null;
    ObjectOutputStream out;
    ImageBuffer ib;
    RoverClient client;
    public static void main(String arg[]){
        try {
            ImageBuffer ib=new ImageBuffer();
            RoverServer server=new RoverServer(ib);
            new Thread(server).start();
            RoverClient client= new RoverClient("150.250.220.214");
            client.start();
        } catch (IOException ex) {
            Logger.getLogger(RoverServer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    public RoverServer(ImageBuffer ib) {
        this.ib=ib;
        try {
            listener = new ServerSocket(9090);
        } catch (IOException ex) {
            Logger.getLogger(RoverServer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    @Override
    public void run() {
        try {
            socket = listener.accept();
            System.out.println("Client accept");
            out =new ObjectOutputStream(socket.getOutputStream());
            while(true){
                //out.printf("", ib.getImage(),ib.getImage2());
                out.writeObject(ib.getImage());
                Thread.sleep(100);
            }
        } catch (IOException ex) {
            System.out.println("Unable to accept client!");
        } catch (InterruptedException ex) {
            Logger.getLogger(RoverServer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

感谢您的帮助!

 gui.setIcons(ImageIO.read(ImageIO.createImageInputStream(s.getInputStream())),null);

将套接字输入流分配给新的读取器,对吗?
每个流只允许一次。
此外,如果将流分配给多个读取器,则只有第一个读取器可以从流
中读取在下面的示例中,只有第一个读取器获取值(服务器发送 hiatall):

        BufferedReader firstReader = new BufferedReader(new InputStreamReader(
                socket.getInputStream()));
        BufferedReader secondReader = new BufferedReader(new InputStreamReader(
                socket.getInputStream()));
        System.out.println("str = " + firstReader.readLine()); //str = hi
        System.out.println("str = " + secondReader.readLine()); //str = null !!!!!
        System.out.println("str = " + firstReader.readLine()); //str = at
        System.out.println("str = " + firstReader.readLine()); //str = all

您应该为每个连接创建一个读取器,并在循环中重复使用它。

最新更新