Java ObjectOutputStream,ObjectInputStream。无法强制转换到ConcurrentHashMap

Java ObjectOutputStream,ObjectInputStream。无法强制转换到ConcurrentHashMap,java,client-server,objectinputstream,objectoutputstream,socketchannel,Java,Client Server,Objectinputstream,Objectoutputstream,Socketchannel,我的客户端向服务器发送公钥。服务器将公钥和客户端的ip地址放入ConcurrentHashMap中,并将ConcurrentHashMap返回给客户端。 公钥和客户端的ip存储在public ConcurrentHashMap list=new ConcurrentHashMap()中 这是使用ObjectOutputStream和ObjectInputStream实现的。但是,我在list=(ConcurrentHashMap)oin.readObject()行中得到一个错误如下:sun.se

我的客户端向服务器发送公钥。服务器将公钥和客户端的ip地址放入ConcurrentHashMap中,并将ConcurrentHashMap返回给客户端。 公钥和客户端的ip存储在
public ConcurrentHashMap list=new ConcurrentHashMap()中
这是使用ObjectOutputStream和ObjectInputStream实现的。但是,我在
list=(ConcurrentHashMap)oin.readObject()行中得到一个错误如下:
sun.security.rsa.RSAPublicKeyImpl不能强制转换为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));
}
}
帮助

编辑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();
    }

}
}
公共类接收{
公共ConcurrentHashMap列表;
公众接受{
列表=新的ConcurrentHashMap();
}
公共静态无效接收(){
serversocketchannelserversocket;
试一试{
serverSocket=ServerSocketChannel.open();
InetSocketAddress local=新的InetSocketAddress(5000);
绑定(本地);
SocketChannel client=serverSocket.accept();
int p=client.socket().getLocalPort();
字符串ip=client.socket().getInetAddress().toString();
(新线程(新WorkerRunnable(client,p,ip)).start();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
注意。 事实上,这是我正在构建的整个java应用程序的简化版本。许多客户端定期向服务器发送它们的公钥。服务器在一个端口侦听。它接收公钥,获取ip地址并将它们放入ConcurrentHashMap中。然后将ConcurrentHashMap发送回客户端。通过这种方式,客户将知道谁是“在线的”。
在这个简化版本中,服务器获取一个客户机的公钥和ip,并仅发送带有客户机公钥和ip的ConcurrentHashMap。

您需要发布Receive类,但我建议您不要运行您认为正在运行的代码。在任何情况下,您的代码都没有意义。您正在生成一个密钥对,然后将其丢弃,只使用公钥部分。如果没有您丢失的私钥,将不会有多大用处。@EJP:我已经包含了Receive类和一些其他详细信息。
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();
    }

}
}