【发布时间】:2015-05-26 18:06:47
【问题描述】:
我目前正在处理一个小型聊天,目前在如何从一个客户端获取一些数据并将其分发给其他客户端方面遇到了一些困难。
到目前为止,这是我的服务器:
public static void main(String[] args) {
try
{
@SuppressWarnings("resource")
ServerSocket server = new ServerSocket(8000);
Hashtable<String, Client> connectedClients = new Hashtable<String, Client>();
while (true)
{
Socket s = server.accept();
System.out.println("Client connected from " + s.getLocalAddress().getHostName());
Client chat = new Client(s);
Thread t = new Thread(chat);
t.start();
}
}
catch (Exception e)
{
System.out.println("An error occured.");
e.printStackTrace();
}
}
这里是客户端类:
public void run()
{
try
{
@SuppressWarnings("resource")
Scanner in = new Scanner(socket.getInputStream());
PrintWriter out = new PrintWriter(socket.getOutputStream());
String newLine = null;
while (true)
{
newLine = in.nextLine();
if(clientName==null){
clientName = newLine;
}
else{
out.println(clientName+": "+newLine);
out.flush();
}
}
}
catch (Exception e)
{
System.out.println(clientName+" disconnected.");
}
}
(请注意,我只添加了非常重要的段落)。如您所见,我正在为每个客户端创建一个新线程,它将第一个发送的字符串作为用户名。我的 GUI 正在处理这个问题,在设置用户名之前禁用所有消息字段,这样就可以了。
但是,您可能已经注意到,有一个未使用的 Hashtable,应该填充一个字符串和一个客户端。您可能已经猜到了,这将是用户名和客户端实例。
现在的问题是,如何将数据从 Thread 类获取到调用的 Server 类。
我想出了 2 个想法:
1) 使线程可观察并将所需的方法添加到我的服务器类。一旦设置了名称,它就会通知我的 Server 类,将 String 和通知类添加到我的 Hashtable,然后将其分发给其他客户端。
2) 向我的服务器添加一个静态方法,它做同样的事情。
但是,我觉得我在这里想得太远了。我很确定有一个更简单的方法可以解决这个问题,但我就是想不通。
谁能帮我解决这个问题?
【问题讨论】:
-
您应该有一个包含集合的
Server对象。现在,您只是将所有服务器组件放在 main 方法中。如果您将集合封装在一个对象中,则可以将该对象传递给每个Client实例 -
我认为,使用现成的东西比从头开始构建更好,我建议使用 Netty 框架,您会在这个问题中找到关于聊天应用程序的简单示例:stackoverflow.com/questions/13923032/…