код ->http://pastebin.com/1PFCGWQyИспользование Синхронное коллекции между потоками
Блоки, которые у меня возникли проблемы с
class ClientSender implements Runnable {
Socket server;
ServerClientFrontEnd SCFE;
public ClientSender(Socket server, ServerClientFrontEnd SCFE){
this.server = server;
this.SCFE = SCFE;
}
public void run(){
try(ObjectOutputStream out = new ObjectOutputStream(server.getOutputStream())){
//System.out.println("Client chat ver. 0.1");
//Scanner get = new Scanner(System.in);
while(!server.isClosed()){
//System.out.print("YOU:");
if(!SCFE.synchronizedOutputCollection.isEmpty()) // Here
{
logger.info("Has made it to ClientSender!");
String string = SCFE.synchronizedOutputCollection.firstElement();
logger.info(string);
out.writeObject(string); // Here
logger.info("Output Queue: " + SCFE.synchronizedOutputCollection.toString());
}
//else{ logger.info("It failed the conditional"); }
}
} catch (IOException ex) {
//logger.info("Closing connection...");
//System.exit(0);
}
}
}
class ClientReceiver implements Runnable {
Socket server;
ServerClientFrontEnd SCFE;
public ClientReceiver(Socket server, ServerClientFrontEnd SCFE){
this.server = server;
this.SCFE = SCFE;
}
public void run(){
try(ObjectInputStream in = new ObjectInputStream(server.getInputStream())){
while(!server.isClosed()){
SCFE.ChatBox.setText(SCFE.ChatBox.getText() + "\nOTHER: " + (String) in.readObject()); //Here
logger.info("Receiver has read object!");
}
} catch (IOException ex) {
logger.info("Closing connection");
System.exit(0);
} catch (ClassNotFoundException ex) {
Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
}
}
По некоторым причинам, я не могу получить эту работу. Я уже работал над средой командной строки, но я хотел перенести ее в графический интерфейс пользователя, и эта проблема заставила меня сосредоточиться на более чем час. Я не знал, как обрабатывать тот факт, что оригинальный класс клиента вызвал другие потоки, которые мне нужно было отправлять и получать информацию на сервер и с сервера.
В принципе, моя программа работает, когда клиент подключается к серверу через ServerSocket, который THEN обрабатывает каждый запрос. Конечно, я недавно узнал о сокетах в четверг, но я хотел сделать свою собственную программу ... в любом случае, перейдя, проблема связана с классом ServerClientFrontEnd, который по какой-то причине и я не знаю как для жизни меня коллекция, которую я использую, чтобы получить введенный текст, либо остается пустой, либо просто не будет читать ее.
Возможно, это может иметь отношение к моей петле while, но она отлично работала раньше. У меня есть TON регистраторов повсюду, чтобы регистрировать все, и если я добавлю инструкцию else, когда он проверяет, является ли коллекция пустой, она определенно активирует инструкцию else повторно, ДАЖЕ ПОСЛЕ того, как synchronizedOutputCollection получает значение. Фактически, я даже печатаю значение внутри коллекции при нажатии кнопки отправки. Фактически, когда я пытаюсь использовать аналогичный оператор печати внутри потока, коллекция пуста и остается пустой.
Как я могу поделиться синхронизированной коллекцией объектов между потоками? Этот вопрос преследует меня, и я был бы очень признателен за ответ.
Также это можно запустить, вам просто нужно активировать сервер и 2 клиента, чтобы проверить его. P.S Я попытался BlockingQueues, но они заставляют поток GUI замерзать, потому что очередь никогда не читается, вызывая тупик.
Хм, нет. Создайте [MCVE] (http://stackoverflow.com/help/mcve) (иначе известный как [SSCCE] (http://sscce.org/)) и вставьте его здесь. Не собирайтесь пробираться сквозь весь ваш проект, ища логическую ошибку. – markspace
Я добавил блок кода для двух рассматриваемых потоков. У меня возникла проблема с добавленными комментариями, кроме областей интересов, где возникает проблема. Я не думаю, что могу сделать SSCCE, потому что это просто не сработает, и я не знаю, как заставить его работать, даже если я обрезал код. –
«Я не могу заставить это работать» не является описанием проблемы. – EJP