【发布时间】:2015-11-12 14:09:06
【问题描述】:
我正在创建一个 SSL 服务器客户端。到目前为止,我实现的是一个简单的服务器,它可以与单个客户端通信(即没有线程)。现在,我想为多个客户端扩展这个应用程序,并且我想为此使用连接池。现在,我需要为此使用线程还是有可以使用的内置库。任何示例、链接等都可以。
PS:我试过谷歌搜索,但没有找到合适的链接。
如果需要,下面是我的代码:
服务器:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import javax.net.ssl.*;
public class SSLServer {
public static void main(String args[]){
String ksname = "file.jks";
char kspass[] = "pass".toCharArray();
char ctpass[] = "pass".toCharArray();
try {
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream(ksname), kspass);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, ctpass);
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(kmf.getKeyManagers(), null, null);
SSLServerSocketFactory ssf = sc.getServerSocketFactory();
SSLServerSocket s = (SSLServerSocket) ssf.createServerSocket(4321);
//printServerSocketInfo(s);
SSLSocket c = (SSLSocket) s.accept();
//printSocketInfo(c);
BufferedReader r = new BufferedReader(new InputStreamReader(c.getInputStream()));
BufferedWriter w = new BufferedWriter(new OutputStreamWriter(c.getOutputStream()));
w.write("Server starts\n");
w.flush();
String k = null;
while((k = r.readLine()) != null){
//do something
if(k.equals("end"))
break;
w.write(resolve(k));
w.newLine();
w.flush();
}
w.close();
r.close();
c.close();
s.close();
} catch (KeyStoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (CertificateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnrecoverableKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (KeyManagementException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static void printSocketInfo(SSLSocket s) {
System.out.println("Socket class: "+s.getClass());
System.out.println(" Remote address = "
+s.getInetAddress().toString());
System.out.println(" Remote port = "+s.getPort());
System.out.println(" Local socket address = "
+s.getLocalSocketAddress().toString());
System.out.println(" Local address = "
+s.getLocalAddress().toString());
System.out.println(" Local port = "+s.getLocalPort());
System.out.println(" Need client authentication = "
+s.getNeedClientAuth());
SSLSession ss = s.getSession();
System.out.println(" Cipher suite = "+ss.getCipherSuite());
System.out.println(" Protocol = "+ss.getProtocol());
}
private static void printServerSocketInfo(SSLServerSocket s) {
System.out.println("Server socket class: "+s.getClass());
System.out.println(" Socket address = "
+s.getInetAddress().toString());
System.out.println(" Socket port = "
+s.getLocalPort());
System.out.println(" Need client authentication = "
+s.getNeedClientAuth());
System.out.println(" Want client authentication = "
+s.getWantClientAuth());
System.out.println(" Use client mode = "
+s.getUseClientMode());
}
private static String resolve(String p){
//some implementation
return "something";
}
}
客户:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.UnknownHostException;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
public class SSLClient {
public static void main(String[] args){
SSLSocketFactory f = (SSLSocketFactory) SSLSocketFactory.getDefault();
try {
SSLSocket c = (SSLSocket) f.createSocket("localhost", 4321);
printSocketInfo(c);
c.startHandshake();
BufferedWriter w = new BufferedWriter(new OutputStreamWriter(c.getOutputStream()));
BufferedReader r = new BufferedReader(new InputStreamReader(c.getInputStream()));
//to input hex code message
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String k = null;
while((k = r.readLine()) != null){
//send message to server
System.out.println(k);
System.out.flush();
k = in.readLine();
if(k.equals("."))
break;
System.out.println(k);
System.out.flush();
w.write(k);
w.newLine();
w.flush();
}
w.close();
r.close();
c.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
【问题讨论】:
-
这里没有任何类型的连接池。您发布的代码创建一个连接,然后退出。它不需要连接池。完全不清楚你在这里问什么,或者你是否知道真正的连接池是什么,或者你为什么认为你需要它。
标签: java multithreading sockets ssl connection-pooling