Java ObjectOutputStream,ObjectInputStream。无法强制转换到ConcurrentHashMap
我的客户端向服务器发送公钥。服务器将公钥和客户端的ip地址放入ConcurrentHashMap中,并将ConcurrentHashMap返回给客户端。 公钥和客户端的ip存储在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
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();
}
}
}