【问题标题】:Java server socket program after one day it stops listeningJava服务器套接字程序在一天后停止侦听
【发布时间】:2014-06-05 09:04:24
【问题描述】:

我有一台服务器,那台机器运行服务器套接字代码。 我使用线程池来维护线程。 问题是,当我启动服务器套接字时,它的监听很好。 但是第二天我看到控制台在某个级别暂停并且没有监听任何 TCP 数据包。 没有产生异常。 java中服务器上的监听数据包是否有任何限制? 我该如何解决这个问题?

服务器类

public final class Server {

    private final ServerSocket serverSocket;
    private final ExecutorService pool;



    public Server(int port, int poolSize)
            throws IOException {
        serverSocket = new ServerSocket(port);
        pool = Executors.newFixedThreadPool(poolSize);


        System.out.println("Server running...");
        runServerEngine();
    }

    public void runServerEngine() { // run the service
        try {
            while (true) {
                System.out.println("user come ");
                pool.execute(new Handler(serverSocket.accept()));
            }
        } catch (IOException ex) {
            System.out.println("Error " + ex);


            //pool.shutdown();
        }
    }

    public static void main(String[] args) throws IOException {
        Server server = new Server(1256, 20);//port number and pooling size
    }
}

处理类

class Handler implements Runnable {

    private Socket socket = null;
    //private static Location location = new Location();


    Handler(Socket socket) {
        this.socket = socket;

    }

    private Handler() {
    }
    String recievedPacket = null;

    @Override
    public void run() {
        // read and service request on socket
        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));

            while ((recievedPacket = in.readLine()) != null) {
                //recievedPacket = in.readLine();
                System.out.println("Recieved packate " + recievedPacket);

                if (recievedPacket != null) {
                    try {
                        System.out.println("Saving function " + recievedPacket);


                    } catch (Exception ex) {
                         System.out.println(ex);
                    }

                }

            }

        } catch (IOException ex) {
           System.out.println(ex);
        }
    }
}

【问题讨论】:

  • 它在监听那个端口吗?尝试网络统计。你有没有进行线程转储? (通过 ctrl+break)它正在运行吗?客户端/服务器之间是否有路由器或类似设备可以断开静态 TCP 连接?
  • 服务器监听没有限制,放上你的代码让我们帮你吧。
  • 我认为您应该正确处理您的资源,例如关闭Handler 中的套接字和阅读器。毕竟可能是资源问题。
  • 无参数 Handler 构造函数有什么用?你不需要那个。

标签: java multithreading sockets


【解决方案1】:

尝试关闭 Handler 的 finally 块中的 insocket 以确保您的系统没有资源不足。

@Override
public void run() {
    // read and service request on socket
    BufferedReader in = null;
    try {
        in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));

        while ((recievedPacket = in.readLine()) != null) {
            //recievedPacket = in.readLine();
            System.out.println("Recieved packate " + recievedPacket);

            if (recievedPacket != null) {
                try {
                    System.out.println("Saving function " + recievedPacket);


                } catch (Exception ex) {
                     System.out.println(ex);
                }

            }

        }

    } catch (IOException ex) {
       System.out.println(ex);
    } finally {
        if (in != null) {
            try {
                in.close();
            } catch (IOException ex) {
                // No-OP
            }

        }

        if (socket != null) {
            try {
                scoket.close();
            } catch (IOException ex) {
                // No-OP
            }
        }
    }
}

如果你是 Java 7+,你可能想看看try with resources

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 2018-11-20
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    相关资源
    最近更新 更多