ObjectOutputStream,ObjectInputStream。无法转换为ConcurrentHashMap

时间:2014-06-29 10:56:30

标签: java client-server objectinputstream objectoutputstream socketchannel

我的客户端向服务器发送公钥。服务器将公钥和客户端的IP地址放在ConcurrentHashMap中,并将ConcurrentHashMap返回给客户端。 公钥和客户端的IP存储在public ConcurrentHashMap<Key,String> list = new ConcurrentHashMap<Key,String>();中 这已使用ObjectOutputStream和ObjectInputStream实现。但是,我在第list = (ConcurrentHashMap<Key, String>) oin.readObject();行中收到错误消息,如下所示:sun.security.rsa.RSAPublicKeyImpl cannot be cast to java.util.concurrent.ConcurrentHashMap

以下是客户端代码:

public class Send {
private Key k;
public Send() {
    try {
        this.k = generate();
    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
private Key generate() throws NoSuchAlgorithmException {
    // TODO Auto-generated method stub
    KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
    kpg.initialize(2048);
    KeyPair kpair = kpg.genKeyPair();
    return kpair.getPublic();
}
public static void send() throws IOException{
    Send s = new Send();
    ConcurrentHashMap<Key,String> list = new ConcurrentHashMap<Key,String>();
    try (SocketChannel channel = SocketChannel.open()) {
        InetSocketAddress local = new InetSocketAddress(5000);
        channel.bind(local);
        InetSocketAddress remote = new InetSocketAddress("192.168.0.101", 5000);
        channel.connect(remote);

        ObjectOutputStream oos = new ObjectOutputStream(channel.socket().getOutputStream());
        oos.writeObject(s.k);
        //oos.close();

        ObjectInputStream oin = new ObjectInputStream(channel.socket().getInputStream());
        list = (ConcurrentHashMap<Key, String>) oin.readObject();
        //oin.close();
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.print(list.get(s.k));
}
}

以下是服务器代码的一部分:

public class WorkerRunnable implements Runnable {

SocketChannel client;
int port;
String ip;
public WorkerRunnable(SocketChannel client, int port, String ip) {
    this.client = client;
    this.port = port;
    this.ip = ip;
}
@Override
public void run() {
    // TODO Auto-generated method stub

    Receive r = new Receive();
    Key k = null;
    try {
        ObjectInputStream oin = new ObjectInputStream(client.socket().getInputStream());
        k = (Key) oin.readObject();
        //oin.close();
        r.list.put(k, ip);

        ObjectOutputStream oos = new ObjectOutputStream(client.socket().getOutputStream());
        oos.writeObject(r.list);
        //oos.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

HELP

编辑1:这是接收类

public class Receive {

public ConcurrentHashMap<Key,String> list;

public Receive() {
    list = new ConcurrentHashMap<Key,String>();
}
public static void receive() {

    ServerSocketChannel serverSocket;

    try {
        serverSocket = ServerSocketChannel.open();
        InetSocketAddress local = new InetSocketAddress(5000);
        serverSocket.bind(local);
        SocketChannel client = serverSocket.accept();
        int p = client.socket().getLocalPort();
        String ip = client.socket().getInetAddress().toString();
        (new Thread(new WorkerRunnable(client, p, ip))).start();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}
}

N.B。 实际上,这是我正在构建的整个Java应用程序的简化版本。许多客户端定期将其公钥发送到服务器。服务器侦听端口。它接收公钥,获取IP地址并将它们放入ConcurrentHashMap。然后将ConcurrentHashMap发送回客户端。通过这种方式,客户将知道谁是在线&#34;。 在这个简化版本中,服务器获取一个客户端的公钥和ip,并使用客户端的公钥和ip发送回ConcurrentHashMap。

0 个答案:

没有答案