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

时间:2014-12-17 09:40:35

标签: java android multithreading sockets server

我使用Java使用Eclipse编码了服务器,我在此服务器上运行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);

    }
}
}

1 个答案:

答案 0 :(得分:0)

我之前想到了,我刚刚在循环之前删除了userName = (String) ois.readObject();并且它运行良好..谢谢你                      - 阿姆贾德