我的客户端向服务器发送公钥。服务器将公钥和客户端的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。