繁体   English   中英

在服务器套接字中启动线程而不停止线程会导致断开连接

[英]Starting Threads without Stopping them in my Server Socket causes disconnections

我有一台使用EclipseJava编码的服务器,我在这台服务器上运行Android Apps ,我的两部手机和该服务器位于同一网络上。

当我从两个电话连接服务器时,我可以看到客户端连接到服务器,而当客户端断开连接时,我也可以看到。

当我从第一个客户端连接时,我与第二个客户端建立连接,然后第一个客户端无缘无故地自动断开连接。 这意味着如果没有一个客户端断开连接,我将无法在服务器上进行两次移动。

可能的事情是,当客户端连接到服务器时,会创建一个线程( myThread ),但是当客户端断开连接时,我认为该线程( MyThread )永远不会停止。 我可以看到有30个线程名称。

我的问题是,如果多个线程导致断开连接,客户端断开连接后如何停止每个线程?

    public Server() {
    // ServerSocket is only opened once !!!

    try {
        serverSocket = new ServerSocket(6000);

        System.out.println("Waiting on port 6000...");
        boolean connected = true;

        // this method will block until a client will call me
        while (connected) {
            Socket singleClient = serverSocket.accept();
            // add to the list
            ServerThread myThread = new ServerThread(singleClient);
            allClients.add(myThread);
            myThread.start();

        }

        // here we also close the main server socket
        serverSocket.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

class ServerThread extends Thread {
    Socket threadSocket;
    String userName;
    boolean isClientConnected;
    InputStream input;
    ObjectInputStream ois;
    OutputStream output;
    ObjectOutputStream oos;

    public ServerThread(Socket s) {
        threadSocket = s;
    }

    public void sendText(String text) {
        try {
            oos.writeObject(text);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void run() {

        try {

            counter++;
            input = threadSocket.getInputStream();
            ois = new ObjectInputStream(input);
            output = threadSocket.getOutputStream();
            oos = new ObjectOutputStream(output);

            userName = (String) ois.readObject();
            isClientConnected = true;


            while (isClientConnected) {

                String singleText;

                singleText = (String) ois.readObject();

                oos.flush();
                    for (ServerThread t : allClients)
                        if (t.isAlive())
                            t.sendText(singleText);


            }
            // close all resources (streams and sockets)
            ois.close();
            oos.close();
            threadSocket.close();
            counter--;

            System.out
                    .println("disconnected : lost connection - connections: "
                            + counter);

        } catch (Exception e) {
            // TODO Auto-generated catch block
            counter--;
            isClientConnected = false;

            System.out.println("Quit App : lost connection - connections: "
                    + counter);

    }
}
}

我想通了,我只是删除了userName = (String) ois.readObject(); 循环之前,它工作正常..谢谢大家– amjad

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM