В программе чата сервера клиента, использующей потоки объектов, как я смогу отправить сообщение всем клиентам и частное сообщение для определенных клиентов?
в моем методе прослушивания соединений я принимаю соединение
public void listenForConnections()
{
String sUserName="";
try{
do {
System.out.println("Waiting on connections");
Socket client = servSocket.accept();
System.out.println("Connection From: " + client.getInetAddress());
//pass message handling to thread and listen
ClientHandler handler = new ClientHandler(client,this);
handler.start();//As usual, this method calls run.
} while (true);
}
catch(Exception e){
e.printStackTrace();
}
}
Затем я передаю этот клиент потоку на сервере для обработки обмена сообщениями;
i, e;
//pass message handling to thread and listen
ClientHandler handler = new ClientHandler(client,this);
handler.start();//As usual, this method calls run.
Как игде я могу хранить список подключенных клиентов?
Я подумал о hastable, ключом которого являются имя пользователя и ObjectOutPutStream.И затем прочитать объект, отправленный после того, как соединение было принято, но я столкнулся с проблемами.Сообщение было командой входа в систему с именем пользователя и командой LOGIN
Мой код стал;
System.out.println («Ожидание соединения»);Socket client = servSocket.accept ();System.out.println ("Connection From:" + client.getInetAddress ());
ObjectOutputStream clientOOS = new ObjectOutputStream(client.getOutputStream());
outputStreams.put(sUserName, oos );
//big problem here
//serializeation
/*ois = new ObjectInputStream(client.getInputStream());
oos = new ObjectOutputStream(client.getOutputStream());
//ask for the username /authenticate
System.out.println("SERVER: getting username");
myMessage inMessageLogin = (myMessage) ois.readObject();
if(inMessageLogin.getCOMMAND()==ServerCommands.CMD_LOGIN)
{
sUserName=inMessageLogin.getsUserName();
System.out.println("SERVED User " + sUserName + " connected.");
//save stream
outputStreams.put(sUserName, oos );
//oos.close();
//oos.flush();
//ois.close();
ois=null;
//oos=null;
}
//end of problem!!!!!*/
Что я прокомментировал, поскольку он выдавал ошибки о поврежденных потоках, есть идеи?
Спасибо
Чтобы отправить сообщение на сервер от клиента;
//default cmd is to send to all
public void sendMessage(String sText,int iCommand)
{
System.out.println("sendMessage");
outMessage=new myMessage();
outMessage.setsUserName(sCurrentUser);
//set command
outMessage.setCOMMAND(iCommand);
outMessage.setsMessage(sText);
System.out.println("send msg" + outMessage.displayMessage());
try {
oos.writeObject(outMessage);
oos.flush();
oos.reset();
//clear up send message from txbox
txtMessage.setText("");
} catch (IOException ex) {
Logger.getLogger(myClientGUI.class.getName()).log(Level.SEVERE, null,
ex);}}
код клиента для подключения к серверу;
public void connectToServer()
{
String sServer=txtServer.getText();
PORT=Integer.parseInt(txtPort.getText());
try {
//host = InetAddress.getByName("localhost");//InetAddress.getLocalHost();
host = InetAddress.getByName(sServer);
clientSocket = new Socket(host, PORT);
}
catch (Exception e){
e.printStackTrace();
}
}
public boolean createStreams()
{
try{
//serial
//*******************************************************************************
// open I/O streams for objects - serialization streams
oos = new ObjectOutputStream(clientSocket.getOutputStream());
ois = new ObjectInputStream(clientSocket.getInputStream());
return true;
}
catch(Exception e)
{
e.printStackTrace();
return false;
}
}