我正在开发一个简单的聊天客户端,我需要服务器来处理多个线程(每个连接1个)
目前我只有1个用户和1个连接
Thread con = new Thread(new Connection());
con.start();
Connection()负责监听来自此特定连接的消息并将其广播到每个客户端(目前只有一个)
我计划创建一个Connection对象数组并为每个创建一个线程,但我不知道我应该从这里做什么,在这种情况下'con'实际代表什么?
答案 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。您可能希望最终调整一些代码。