Hjälp med Java - enkelt chatprogram!

Permalänk
Medlem

Hjälp med Java - enkelt chatprogram!

Behöver lite hjälp. Är nybörjare på det här (även om jag med nöd och näppe tog mig igenom en 7.5hp kurs i Java). Jag håller på med ett litet chattprogram, som inte är mitt från början utan jag följde en tutorial på youtube, men som jag tänkt utveckla på olika sätt. Programmet ser ut mer eller mindre exakt som på följande länk:
http://stackoverflow.com/questions/15729989/simple-text-chat-application (inte jag som skrivit det inlägget)

Istället för att köra startRunning(); i klientens mainprogram så har jag lagt till en knapp för att köra metoden vid klick. Dvs slutmålet är att klienten inte ska koppla upp till servern direkt vid start, utan vänta på knapptrycket. Men här stöter jag på problem. Klienten connectar till servern. Det får jag bekräftat. Men jag kan inte skriva från klienten och skriver jag något från servern så kommer det inte till klienten. Det är först när jag från serverns sida avslutar som allt kommer till klienten. Antar att det har att göra med flush funktionen.

Men jag förstår inte problemet. Vad är skillnaden att köra startRunning(); från mainprogrammet eller under ett knapptryck?
Såhär ser knappen ut:

button.addActionListener( new ActionListener(){ public void actionPerformed(ActionEvent event){ startRunning(); } } );

Visa signatur

"- Du, kan jag ringa upp dig senare. Det är någon idiot i toabåset bredvid
som sitter och svarar på allt jag säger till dig."

Permalänk
Medlem

Om jag inte misstar mig så kommer startRunning-metoden att köra på EDT-tråden, Event Dispatch Thread: https://docs.oracle.com/javase/tutorial/uiswing/concurrency/d...

Vilket betyder att inga events, d.v.s. du försöker skicka något, eller andra uppgifter, t.ex. showMessage som skickas till EDT med invokeLater, kommer att kunna utföras eftersom tråden är fullt upptagen med att köra startRunning. Allt ligger i en kö och väntar på att startRunning ska bli färdig, vilket sker när servern kopplar ifrån.

Tidigare körde startRunning i huvudtråden (main thread) och EDT kunde ta hand om de mindre uppgifterna. Lösningen är att starta upp en separat tråd när man ansluter.

Visa signatur

Arch Linux - i5 12500@4.75GHz - Asrock B760M PG Riptide - 32GB DDR5 6000MHz - RTX 2070 Super - 1TB SN770 - 1TB SN550 - U32PWQU 4K
Dell Latitude 7400 2 in 1 - Arch Linux - i5 8265u

Permalänk
Medlem

Tack för svaret. Det här var helt nya saker för mig. Förhoppningsvis har jag lärt mig något nytt
Efter lite youtube:ande om threads och swing så kom jag upp med följande lösning! Jag vet inte om det på något sätt är någon optimal lösning. Men det fungerar nu i alla fall

new SwingWorker(){ protected Object doInBackground() throws Exception{ startRunning(); return null; } }.execute();

Visa signatur

"- Du, kan jag ringa upp dig senare. Det är någon idiot i toabåset bredvid
som sitter och svarar på allt jag säger till dig."

Permalänk
Avstängd

Om du är fortsatt intresserad kan du läsa vidare om ExecutorService. Då skapar du en klass som implementerar Callable och dina trådar jag returnera data.

Använder du en lista kommer ordningen vara garanterad vilket är smidigt i vissa fall. I nedan exempel kommer upp till 12 trådar behandla din data.

List<Future<String>> set = new ArrayList(); ArrayList<String> toEncrypt = getSomeData(); ExecutorService executor = Executors.newFixedThreadPool(12); for (String data : toEncrypt) { Callable<String> callable = new Encryptor(data); Future<String> future = executor.submit(callable); set.add(future); }