首页 > 解决方案 > 维护多个套接字连接聊天应用程序

问题描述

我正在构建一个 IRC 客户端,它是一个基于 IRC 协议的聊天应用程序。在我的应用程序中,我需要创建一个套接字并与服务器建立连接(即:freenode.net) 在这个服务器中有多个通道,并且我有这些通道的列表视图。当我单击一个频道项目时,我想通过调用新的 ConnectTask() 并创建一个新活动然后开始聊天来连接到该频道。但是,当我返回列表视图并再次单击频道时,我想恢复之前在 ConnectTask() 上的聊天内容,此外,我还想连接到其他频道并保持状态当我暂时“离开”频道时。我将如何实现这一目标?我应该为每个频道打开一个新活动吗?还是片段?我应该使用线程还是其他东西?非常感谢!

连接.java

public void start() throws IOException {
    running = true;

    Socket socket = new Socket(host, port);
    try {
        out = new PrintWriter(new BufferedWriter
                (new OutputStreamWriter
                        (socket.getOutputStream())),
                true);
        in = new BufferedReader(new InputStreamReader
                (socket.getInputStream()));

        send("NICK " + nick);
        send("USER " + username + " 0 * :" + realname);
        send("JOIN " + channel);

        while (running) {
            String message = in.readLine();
            if (message != null)
                listener.rcv(message);
        }

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        out.flush();
        out.close();
        in.close();
        socket.close();
    }
}

SingleChannelActivity 中的 ConnectTask()。

private class ConnectTask extends AsyncTask<String, String, Connection> {

    @Override
    protected Connection doInBackground(String... params) {
        connection = new Connection(params[0],
                Integer.parseInt(params[1]),
                params[2],
                params[3]
                ,
                new Connection.MessageCallback() {
                    @Override
                    public void rcv(String message) {
                        publishProgress(message);
                    }
                });

        try {
            connection.start();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onProgressUpdate(String... values) {
        parseSrv(values[0]);
    }
}

我在通道项启动的活动打开时调用它

 new ConnectTask().execute("irc.freenode.net", "6667", nick, channel);

频道列表视图

在此处输入图像描述

标签: android

解决方案


推荐阅读