Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SSLServerSocket在线程中接受SSLSocket客户端,是否存在最大值?_Java_Multithreading_Serversocket - Fatal编程技术网

Java SSLServerSocket在线程中接受SSLSocket客户端,是否存在最大值?

Java SSLServerSocket在线程中接受SSLSocket客户端,是否存在最大值?,java,multithreading,serversocket,Java,Multithreading,Serversocket,我在Java中有一个SSLServerSocket,当连接客户端时,我为其通信创建一个线程: System.setProperty("javax.net.ssl.keyStore", "keystore"); System.setProperty("javax.net.ssl.keyStorePassword", "password"); SSLServerSocket server = (SSLServerSocket)null; if(ipSocket =

我在Java中有一个SSLServerSocket,当连接客户端时,我为其通信创建一个线程:

    System.setProperty("javax.net.ssl.keyStore", "keystore");
    System.setProperty("javax.net.ssl.keyStorePassword", "password");

    SSLServerSocket server = (SSLServerSocket)null;

    if(ipSocket == null){
        ipSocket = new HashMap<String,java.net.Socket>();
    }

    try {

        SSLServerSocketFactory sslserversocketfactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
        server = (SSLServerSocket) sslserversocketfactory.createServerSocket(4380);
        log.info("Server started");

    } catch(IOException e) {
        e.printStackTrace();
    }

    while(true){

        try {
            SSLSocket client = (SSLSocket) server.accept();
            log.info("new client");

        } catch (Exception e){
            e.printStackTrace();
        }
    }
System.setProperty(“javax.net.ssl.keyStore”、“keyStore”);
setProperty(“javax.net.ssl.keystrepassword”、“password”);
SSLServerSocket服务器=(SSLServerSocket)null;
if(ipSocket==null){
ipSocket=newHashMap();
}
试一试{
SSLServerSocketFactory SSLServerSocketFactory=(SSLServerSocketFactory)SSLServerSocketFactory.getDefault();
服务器=(SSLServerSocket)sslserversocketfactory.createServerSocket(4380);
log.info(“服务器已启动”);
}捕获(IOE异常){
e、 printStackTrace();
}
while(true){
试一试{
SSLSocket客户端=(SSLSocket)server.accept();
日志信息(“新客户”);
}捕获(例外e){
e、 printStackTrace();
}
}
问题在于代码有时会拒绝连接。它发生在代码运行一段时间时,因此我认为问题在于客户端失去了连接并重新连接,但前一个线程仍然处于活动状态,并且存在一个最大SSLServerSockets

这会发生吗?最多多少


断开连接时,我如何杀死线程?

根据您的代码和我对网络的理解(从较低级别和API级别),您可能错误地使用了API

在较高的层次上,您希望以不同的方式进行此操作

public static void main(String[] args) {
    System.setProperty("javax.net.ssl.keyStore", "keystore");
    System.setProperty("javax.net.ssl.keyStorePassword", "password");
    SSLServerSocket server = (SSLServerSocket)null;
    if(ipSocket == null){
        ipSocket = new HashMap<String,java.net.Socket>();
    }

    try {
        SSLServerSocketFactory sslserversocketfactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
        // Creates a socket with a default backlog of 50 - meaning
        // There will be a maximum of 50 client connection attempts on this 
        // socket after-which connections will be refused. If the server is
        // overwhelmed by more than that number of requests before they can be
        // accepted, they will be refused
        // The API allows for you to speccify a backlog.
        server = (SSLServerSocket) sslserversocketfactory.createServerSocket(4380);
        log.info("Server started");
    } catch(IOException e) {
        e.printStackTrace();
    }

    while(true){
        try {
            // This will take one of the waiting connections
            SSLSocket client = (SSLSocket) server.accept();
            log.info("new client");
            // HERE is where you should create a thread to execute the
            // conversation with the client.
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}
publicstaticvoidmain(字符串[]args){
setProperty(“javax.net.ssl.keyStore”、“keyStore”);
setProperty(“javax.net.ssl.keystrepassword”、“password”);
SSLServerSocket服务器=(SSLServerSocket)null;
if(ipSocket==null){
ipSocket=newHashMap();
}
试一试{
SSLServerSocketFactory SSLServerSocketFactory=(SSLServerSocketFactory)SSLServerSocketFactory.getDefault();
//创建一个默认待办事项为50的套接字
//此服务器上最多有50次客户端连接尝试
//套接字,之后将拒绝连接。如果服务器
//被超过这个数量的请求压得喘不过气来
//如果接受,他们将被拒绝
//API允许您指定积压工作。
服务器=(SSLServerSocket)sslserversocketfactory.createServerSocket(4380);
log.info(“服务器已启动”);
}捕获(IOE异常){
e、 printStackTrace();
}
while(true){
试一试{
//这将占用一个等待的连接
SSLSocket客户端=(SSLSocket)server.accept();
日志信息(“新客户”);
//这里是您应该创建一个线程来执行
//与客户的对话。
}捕获(例外e){
e、 printStackTrace();
}
}
}
我希望能更准确地回答你的问题

关于EJP的评论,我更新了我的解释并引用了以下文件:

传入连接指示(连接请求)的最大队列长度设置为backlog参数。如果连接指示在队列已满时到达,则连接将被拒绝


你的头衔与你的问题无关。没有所谓的
SSLSocketServer
,代码中只有一个
SSLServerSocket
。你是说
SSLSocket
?这是一个错误,它是一个SSLServerSocket。Regards在代码中仍然只有一个。如果没有堆栈跟踪和异常抛出位置的指示,这不是一个真正的问题。我不知道异常代码。你知道它“拒绝连接”,你不知道这是什么症状?难以置信。在任何情况下,你都必须发现它们,并将它们发布在这里。“backlog”并没有定义连接的最大数量。它定义了accept()尚未返回的挂起连接器的最大数量。这样的服务器可以支持数千个并发连接。接受连接不会改变backlog值。您提供的“backlog”值是大多数平台上的默认值,因此它实际上不会改变任何东西。我如何提高这个数字?