Java SSLServerSocket在线程中接受SSLSocket客户端,是否存在最大值?
我在Java中有一个SSLServerSocket,当连接客户端时,我为其通信创建一个线程: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 =
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”值是大多数平台上的默认值,因此它实际上不会改变任何东西。我如何提高这个数字?