gpt4 book ai didi

java套接字服务器程序在一段时间后不接受连接

转载 作者:行者123 更新时间:2023-12-01 09:50:55 25 4
gpt4 key购买 nike

我有一个套接字客户端应用程序,它在指定端口上的主线程中监听传入连接,接受传入连接并为每个连接启动一个用户线程。

此设置有时会起作用,然后应用程序将停止接受任何新的连接。恢复的唯一方法是重新启动应用程序。我不知道为什么会发生这种情况......这是我的 main,它为每个连接接受并启动一个新线程。

while(ServerOn)
{
ServerSocket myServerSocket;
private static ArrayList<Socket> connecitons;
try {
// Accept incoming connections.
Socket conn = myServerSocket.accept();
// adds the new connections to the socket
connections.add(conn);

// accept() will block until a client connects to the server.
// If execution reaches this point, then it means that a client
// socket has been accepted.

// For each client, we will start a service thread to
// service the client requests.

// Start a Service thread

ServerThread cliThread = new ServerThread(conn);
cliThread.start();
} catch (IOException ioe) {
System.out.println("Exception encountered on accept. Ignoring. Stack Trace :");
ioe.printStackTrace();
}
}
try {
myServerSocket.close();
System.out.println("Server Stopped");
} catch (Exception ioe) {
System.out.println("Problem stopping server socket");
System.exit(-1);
}
}

请帮忙。

编辑 1

这是类声明:

class ServerThread extends Thread {
Socket conn;
boolean m_bRunThread = true;
InputStream in = null;
OutputStream outStream = null;



//calling the 1-argument constructor with the socket parameters
ServerThread(Socket s) {
conn = s;
}

//Subclasses of Thread should override this method.
public void run() {
//lot of variables declared here.

try {
// Class InputStream is used for receiving data (as bytes) from client.
in = conn.getInputStream();
// Class OutputStream is used for sending data (as bytes) to client.
outStream = conn.getOutputStream();
/*
* 1. Go to Read Thread
* 2. Check for incoming data stream from Client
* 3. Go to read routine and process only if the data is received from the client
* 4. If there is no data for X minutes then close the socket.
*/
conn.setSoTimeout(time in milliseconds);
String inLine=null;

while (m_bRunThread) {
// read incoming stream
while ((c=in.read(rec_data_in_byte))!= -1)

{...............

并且运行方法继续...

最佳答案

我的观察是基于您提供的上述代码。我看到以下一些对我来说毫无疑问的事情:

  1. private static ArrayList<Socket> connecitons;

我没有得到这个列表的需要。根据代码,我们总是添加 conn每个请求都在此列表中的对象。我们不会在任何地方删除它们(我还没有看到完整的代码)。如果是这种情况,那么这个列表的大小总是在增长。并且可能会导致OutOfMemoryError。

  • while (m_bRunThread) {....}
  • ServerThread类的run()方法中,变量是m_bRunThread永远正确。如果是这种情况,那么该线程将永远不会终止。所以没有。 Activity 线程的数量不断增加。这将使应用程序无响应。对于 ConcurrentModificationException :因为您没有使用 Iterator (或 for-each 循环)来迭代列表,因此即使在多线程场景下也不会抛出此异常。

    关于java套接字服务器程序在一段时间后不接受连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37607915/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com