首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sockets ClassCastException HashMap

Sockets ClassCastException HashMap
EN

Stack Overflow用户
提问于 2013-09-29 22:58:23
回答 2查看 729关注 0票数 1

我已经创建了一个serverSocket并接受一个客户端连接。但是,当我尝试从客户端读取时,它抛出了以下异常。如果我将HashMap更改为ArrayList,它也不起作用。

代码语言:javascript
复制
Exception in thread "Thread-3" java.lang.ClassCastException: java.awt.Point cannot be cast to java.util.HashMap
at ServerSide.Server.getPoints(Server.java:112)
at ServerSide.Server.run(Server.java:69)
代码语言:javascript
复制
public void getPoints() throws IOException, ClassNotFoundException {
    points = (HashMap<Point, Boolean>) objectInputStream.readObject();
    Iterator iterator = points.entrySet().iterator();
    while (iterator.hasNext()) {
        Map.Entry<Point, Boolean> currentPoint = (Map.Entry<Point, Boolean>) iterator.next();
        currentPoint.setValue(firgure.isHit(currentPoint.getKey().x, currentPoint.getKey().y));
    }
    objectOutputStream.writeObject(points);
}

发送方式:

代码语言:javascript
复制
@Override
public HashMap<Point, Boolean> update(HashMap<Point, Boolean> points) throws IOException {
    output.println("hit");
    output.flush();
    toServer.writeObject(points);
    try {
        return (HashMap<Point, Boolean>) fromServer.readObject();
    } catch (ClassNotFoundException e) {
        System.out.println("Some shit with classCast!");
        return null;
    }
}

UDP新类型异常:

代码语言:javascript
复制
java.io.StreamCorruptedException: invalid type code: 3F
  at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1377)
  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
  at ServerSide.Server.getPoints(Server.java:102)
  at ServerSide.Server.run(Server.java:69)

这个视频展示了它是如何(不)工作的:http://www.youtube.com/watch?v=8924rrSyWfY&feature=youtu.be

也许我的服务器或客户端坏了?有没有人看出来有什么错误?(我为我的英语感到抱歉)

服务器

代码语言:javascript
复制
public class Server extends Thread {
    public static final int PORT = 1234;
    private static ServerSocket serverSocket;
    private Socket client;
    private ObjectInputStream objectInputStream;
    private ObjectOutputStream objectOutputStream;
    private BufferedReader bufferedReader;
    private PrintWriter printWriter;
    private Firgure firgure;
    private HashMap<Point, Boolean> points;


    private Server(Socket client) {
        System.out.println("Client connected");
        this.client = client;
        firgure = new Firgure();
        try {
            this.client.setSoTimeout(0);
        } catch (SocketException e) {
            e.printStackTrace();
        }
        setDaemon(true);
        setPriority(NORM_PRIORITY);
        start();
    }

    static public void serverStart() throws IOException {
        System.out.println("Server startes");
        serverSocket = new ServerSocket(PORT);
        serverSocket.setSoTimeout(0);
        System.out.println("Wait client");
        while (true) new Server(serverSocket.accept());
    }

    static public void main(String[] args) throws IOException {
        serverStart();
    }

    @Override
    public void run() {
        try {
            objectInputStream = new ObjectInputStream(client.getInputStream());
            objectOutputStream = new ObjectOutputStream(client.getOutputStream());
            bufferedReader = new BufferedReader(new InputStreamReader(client.getInputStream()));
            printWriter = new PrintWriter(client.getOutputStream(), true);
            points = new HashMap<Point, Boolean>();
            String inputLine;

            do {
                inputLine = bufferedReader.readLine();
                if (inputLine.equalsIgnoreCase("hit")) getPoints();
                else if (inputLine.equalsIgnoreCase("echo")) echo();
                else if (inputLine.equalsIgnoreCase("close")) close();
                else if (inputLine.equalsIgnoreCase("set")) set();
                else if (inputLine.equalsIgnoreCase("get")) get();
                else continue;
            } while (true);
        } catch (NullPointerException e) {
            System.out.println("Client disconnect");
        } catch (IOException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        } catch (java.lang.ClassNotFoundException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }

    public int getR() {
        return firgure.getR();
    }

    public void setR(int R) {
        firgure.setR(R);
    }

    public void set() throws IOException, ClassNotFoundException {
        setR((Integer) objectInputStream.readObject());
    }

    public void get() throws IOException {
        objectOutputStream.writeObject(new Integer(getR()));
    }

    public void getPoints() throws IOException, ClassNotFoundException {
        try {
            points = (HashMap<Point, Boolean>) objectInputStream.readObject();
        } catch (StreamCorruptedException e) {
            e.printStackTrace();
            points = new HashMap<Point, Boolean>();
        } catch (ClassCastException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

        Iterator iterator = points.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<Point, Boolean> currentPoint = (Map.Entry<Point, Boolean>) iterator.next();
            currentPoint.setValue(firgure.isHit(currentPoint.getKey().x, currentPoint.getKey().y));
        }
        objectOutputStream.writeObject(points);
    }

    public void echo() throws IOException {
        printWriter.println(bufferedReader.readLine());
    }

    private void close() {
        try {
            if (objectInputStream != null) objectInputStream.close();
            if (objectOutputStream != null) objectOutputStream.close();
            if (bufferedReader != null) bufferedReader.close();
            if (client != null) client.close();
        } catch (IOException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }
}

CLient

代码语言:javascript
复制
public class Client implements IModel {
    private static final int PORT = 1234;
    private static final String HOST = "localhost";
    private Socket server;
    private ObjectOutputStream toServer;
    private ObjectInputStream fromServer;
    private BufferedReader input;
    private PrintWriter output;

    @Override
    public HashMap<Point, Boolean> update(HashMap<Point, Boolean> points) throws IOException {
        output.println("hit");
        output.flush();
        toServer.writeObject(points);
        try {
            return (HashMap<Point, Boolean>) fromServer.readObject();
        } catch (ClassNotFoundException e) {
            System.out.println("Some shit with classCast!");
            return null;
        }
    }

    @Override
    public void connect() throws IOException {
        server = new Socket(HOST, PORT);
        toServer = new ObjectOutputStream(server.getOutputStream());
        fromServer = new ObjectInputStream(server.getInputStream());
        input = new BufferedReader(new InputStreamReader(server.getInputStream()));
        output = new PrintWriter(server.getOutputStream(), true);
    }

    @Override
    public void disconnect() throws IOException {
        if (output != null) output.close();
        if (input != null) input.close();
        if (fromServer != null) fromServer.close();
        if (toServer != null) toServer.close();
        if (server != null) server.close();
    }

    @Override
    public boolean isConnected() throws IOException {
        if (server == null) return false;
        return server.isConnected();
    }

    @Override
    public int getFigureRadius() throws IOException {
        output.println("get");
        output.flush();
        try {
            return (Integer) fromServer.readObject();
        } catch (ClassNotFoundException e) {
            System.out.println("Some shit with cast");
            return 0;
        }
    }

    @Override
    public void setFigureRadius(int newRadius) throws IOException {
        output.println("set");
        output.flush();
        toServer.writeObject(newRadius);
    }
}
EN

回答 2

Stack Overflow用户

发布于 2013-09-29 23:01:51

从您的异常消息中可以清楚地看到这一点。您正在发送一个点,并尝试接收一个HashMap。

票数 1
EN

Stack Overflow用户

发布于 2013-09-29 23:03:29

从日志中,你会得到关于类型转换的错误:

代码语言:javascript
复制
 points = (HashMap<Point, Boolean>) objectInputStream.readObject();

要调试,请尝试:

代码语言:javascript
复制
Object obj = objectInputStream.readObject();

if(obj instanceof Map<Point, Boolean>){
 ...
}
else if(obj instanceof String){
 ...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19079468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档