小编Zar*_*jio的帖子

Java和SSL - java.security.NoSuchAlgorithmException

我已经构建了一个Java程序作为服务器上数据库的前端,我正在尝试使用SSL来加密客户端和服务器之间的流量.这是我发出的用于创建服务器证书的命令:

keytool -genkey -alias localhost -keyalg RSA -keypass kpass123 -storepass kpass123 -keystore keystore.jks
Run Code Online (Sandbox Code Playgroud)

这是相关代码:

System.setProperty("javax.net.ssl.keyStore",
                   "G:/Data/Android_Project/keystore.jks");

System.setProperty("javax.net.ssl.keyPassword", "kpass123");

SSLServerSocketFactory factory = 
    (SSLServerSocketFactory)SSLServerSocketFactory.getDefault();

SSLServerSocket accessSocket = 
    (SSLServerSocket)factory.createServerSocket(DB_ACCESS_PORT);
Run Code Online (Sandbox Code Playgroud)

当我尝试运行它时,我抓住了这个:

java.security.NoSuchAlgorithmException:构造实现时出错(算法:默认,提供者:SunJSSE,类:com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)

我还发现"KeyPairGenerator"服务有DIFFIEHELLMAN,DSA,RSA算法,而"SSLContext"有算法SSL,TLS,SSLV3,DEFAULT,TLSV1.

我是否需要找到一些方法将RSA安装到SSLContext服务中?我甚至在看正确的服务吗?我不应该使用RSA吗?

我是整个SSL - 安全 - 证书的新手,它让我感到震惊的是,当他们应该访问相同的证书时,这些不同的服务中的每一个都没有相同的算法.

java security ssl

33
推荐指数
1
解决办法
13万
查看次数

在创建它的Activity被销毁后,Android线程会发生什么?

在我的Android应用程序中,主Activity有时会启动一个Thread来从服务器加载数据.该线程修改应用程序的数据库并编辑一些重要文件.AFAIK,似乎这个线程继续执行.如果Android进入低内存状态并决定终止整个应用程序,该线程会发生什么?这个线程可能会过早死亡吗?如果是这样,有什么方法我可以看到该线程被杀死,并做一些事情吗?

我问,因为这个线程修改了数据库中的重要数据,如果它突然被杀死,应用程序可能会停止正常运行.

java multithreading android android-activity

18
推荐指数
4
解决办法
6109
查看次数

如何通过Java在SQLite中强制执行外键约束?

看来SQLite默认不强制执行外键.我正在使用sqlitejdbc-v056.jar并且我已经读过使用PRAGMA foreign_keys = ON;将打开外键约束,并且需要在每个连接的基础上打开它.

我的问题是:我需要执行哪些Java语句来打开此命令?我试过了:

connection.createStatement().execute("PRAGMA foreign_keys = ON");
Run Code Online (Sandbox Code Playgroud)

Properties properties = new Properties();
properties.setProperty("PRAGMA foreign_keys", "ON");
connection = DriverManager.getConnection("jdbc:sqlite:test.db", properties);
Run Code Online (Sandbox Code Playgroud)

connection = DriverManager.getConnection("jdbc:sqlite:test.db;foreign keys=true;");
Run Code Online (Sandbox Code Playgroud)

但这些都不起作用.这里有什么我想念的吗?

我已经看到了这个答案,我想做同样的事情,只使用JDBC.

java sqlite jdbc foreign-keys

15
推荐指数
4
解决办法
1万
查看次数

(可能)数百个移动客户端访问MySQL数据库的最佳方式是什么?

所以这里是交易.我正在开发一个Android应用程序(虽然它可以像任何其他移动平台一样容易)偶尔会向服务器发送查询(编写的是Java).然后,该服务器将在MySQL数据库中搜索查询,并将结果发送回Android.虽然这听起来很通用,但这里有一些细节:

  1. 每次查询时,Android都会与服务器建立新的TCP连接.服务器地理位置接近,Android可能会移动很多,而且,由于Android应用程序可能只运行几个小时而只发送一些查询,这似乎是资源的最佳使用.

  2. 服务器可能同时拥有数百个(或甚至数千个)这些查询.

  3. 由于每个查询都在自己的Thread中运行,因此每个查询至少需要自己的Statement(并且可以拥有自己的Connection).

现在,服务器设置为与数据库建立一个连接,然后为每个查询创建一个新的Statement.我对那些有一些数据库经验的人的问题(特别是MySQL,因为它是一个MySQL数据库)是:

a)从单个连接创建一个每个线程的语句是否可以安全线程?据我所知,只是寻找确认.

b)多线程是否有任何线程安全的方式来使用单个PreparedStatement?这些查询都将完全相同,并且由于每个线程只执行一个查询然后返回,这将是理想的.

c)我应该为每个线程创建一个新的连接,还是从单个连接生成新的语句更好?我认为单个Connection在性能方面会更好,但我不知道建立数据库连接的开销是多少.

d)最好是为所有这些使用存储的SQL过程吗?

我们非常感谢您对这些事项的任何提示/意见/建议.

编辑:

为了澄清,android通过网络向服务器发送查询,然后服务器查询数据库.android不直接与数据库通信.我主要想知道服务器数据库连接的最佳实践.

java mysql database mobile multithreading

5
推荐指数
1
解决办法
515
查看次数

Java中的集合的size()的时间复杂度是多少?

我知道,这似乎是一个愚蠢的问题,你会期望任何集合上size()的时间复杂度都是O(1) - 但我发现我的代码中需要调用大小的"优化" ()实际上减慢了速度.

那么,Java中的Sets的size()的时间复杂度是多少?

我的代码是一个递归算法的实现,用于在图中找到最大派系(不重要).基本上,优化只是检查两个集合是否具有相同的大小(这些集合是以任何一种方式构造的),并且如果它们的大小相等,则仅允许再一次递归调用(在此之后停止递归).

这是我的代码的(简化)版本:

        private static void recursivelyFindMaximalCliques(Set<Integer> subGraph, Set<Integer> candidates, Set<Integer> notCandidates) {
    boolean noFurtherCliques = false;

    Iterator<Integer> candidateIterator = candidates.iterator();
    while (candidateIterator.hasNext()) {
        int nextCandidate = candidateIterator.next();
        candidateIterator.remove();
        subGraph.add(nextCandidate);

        Set<Integer> neighbors = getNeighbors(nextCandidate);
        Set<Integer> newCandidates = calculateIntersection(candidates, neighbors);
        Set<Integer> newNotCandidates = calculateIntersection(notCandidates, neighbors);

        //if (newCandidates.size() == candidates.size())
        //  noFurtherCliques = true;
        recursivelyFindMaximalCliques(subGraph, newCandidates, newNotCandidates);
        //if (noFurtherCliques)
        //  return;

        subGraph.set.remove(nextCandidate);
        notCandidates.set.add(nextCandidate);
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经注释掉的那些是有问题的 - 你可以看到它们检查newCandidates和候选集的大小是否相同,如果它们是,则递归只允许更深一层.

当行被取消注释时,代码运行速度减慢约10% - 无论使用的集合是HashSets,TreeSet还是LinkedHashSets,都是如此.这没有任何意义,因为这些行确保将有FEWER递归调用.

我唯一可以假设的是对集合上size()的调用需要很长时间.在Java中调用sets上的size()是否需要比O(1)更长的时间?

编辑

既然有人问过,这里是calculateIntersection():

private static IntegerSet calculateIntersection(Set<Integer> …
Run Code Online (Sandbox Code Playgroud)

java size set hashset treeset

3
推荐指数
1
解决办法
3733
查看次数

如何在使用后清除缓冲区?

我正在使用BufferedReader.我只是想知道如何在每一行从键盘读取值后清除BufferedReader.我喜欢用

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String male = br.readLine();
Run Code Online (Sandbox Code Playgroud)

请帮帮我.

java

0
推荐指数
2
解决办法
1352
查看次数