多线程,java聊天客户端

时间:2013-12-02 17:39:28

标签: java multithreading

我正在开发一个简单的聊天客户端,我需要服务器来处理多个线程(每个连接1个)

目前我只有1个用户和1个连接

Thread con = new Thread(new Connection());
con.start();

Connection()负责监听来自此特定连接的消息并将其广播到每个客户端(目前只有一个)

我计划创建一个Connection对象数组并为每个创建一个线程,但我不知道我应该从这里做什么,在这种情况下'con'实际代表什么?

3 个答案:

答案 0 :(得分:1)

在此处查看java chat server的示例,具体为:

private ArrayList<ClientSocket> clients;

...

while (!disconnect){
    Socket skt = srvr.accept();
    ClientSocket client = new ClientSocket(skt);
    keepAlive.addToQueue(client);
    clients.add(client);
}

答案 1 :(得分:1)

如果Connection是一个自定义类,其中包含有关某个连接的信息(我认为是这样),那么您不希望将其传递给线程。

您可能会从阅读有关Defining and Starting a Thread的Java文档中受益。您可能想要的是每次从客户端收到连接时启动new Thread()。您可以使用以下代码段完成此操作:

new Thread(){
    public void run() {
        System.out.println("blah");
    }
}.start();

无论你在run()函数中放置什么代码都会在一个线程中运行。

要回答问题的第二部分,在您的示例中,您的con对象表示执行线程的单个实例。

答案 2 :(得分:0)

目前你有一个主题和一个用户,如你所说。

Thread con = new Thread(new Connection());
con.start();

如果你想要多个线程,处理多个连接,你会想要多个con。 (con是一个线程,我们想要多个线程)

或许for-loop对你有用吗?

Thread[] connections = new Thread[/*number of connections*/];
for (int i = 0; i < connections.length(); i++)
{
    connections[i].start();
}

要进一步扩展,在现实世界中,在人们尝试连接之前,您可能不会知道需要多少连接。在这种情况下,您可能希望使用某种类型的集合和while()循环。 ArrayList是一个很好的首发。

ArrayList<Thread> connections = new ArrayList<Thread>();
while (true)
{
    Thread c = new Thread(new Connection());
    connections.add(c);
    c.start();
}

您的设置有点奇怪,但我假设您正在调用的new Connection构造函数ServerSocket.accept()下的某个位置。 如果你不是,你需要在客户端连接时只做一个线程,或者这个while循环将运行猖獗。 通常,我会有一个Connection对象来处理它自己的Thread和其他细节,而不是一个处理其Connection对象的Thread。您可能希望最终调整一些代码。