Java Chatting program, sänder ingen message

Permalänk

Java Chatting program, sänder ingen message

Hej
Innan jag börjar min fråga, jag vill att säga ursäkta med språket eftersom jag är inte svensk man.
För min gymnasiearbete, jag ska göra ett chatting program.

Jag vet att min kod ses ut hemskt men jag är inte klart med kodningen. Jag ska försätta att hantera min kod.

Kod ses ut så här:

' package Chat; //Server import java.awt.*; import java.awt.event.*; import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.ServerSocket; import java.net.Socket; import javax.swing.*; public class Chat_Server extends JFrame implements ActionListener{ JButton jb1 = new JButton("Invite"); JButton Name = new JButton("Name"); JButton Enter = new JButton("Enter"); JPanel jp1 = new JPanel(); JPanel jp2 = new JPanel(); JPanel jp3 = new JPanel(); static JTextArea textarea = new JTextArea(100,100); JTextField textfield = new JTextField(35); static ServerSocket SS; static Socket S; static DataInputStream DIS; static DataOutputStream DOS; public Chat_Server(){ jp1.setLayout(new FlowLayout()); jp1.add(jb1); jp1.add(Name); jb1.addActionListener(this); Name.addActionListener(this); jp2.add(textarea); jp3.setLayout(new FlowLayout()); jp3.add(textfield); jp3.add(Enter); add(jp1, BorderLayout.NORTH); add(jp2, BorderLayout.CENTER); add(jp3, BorderLayout.SOUTH); Enter.addActionListener(this); setSize(500,500); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); } public void actionPerformed(ActionEvent e){ String name; if(e.getSource()==jb1) Call(); if(e.getSource()==Name){ name = JOptionPane.showInputDialog("Type your name"); String Servername = name; } if(e.getSource()==Enter){ try{ String MessageOut= ""; MessageOut = textfield.getText(); DOS.writeUTF(MessageOut); }catch( Exception ex){ System.out.println("ERROR!"); } } } public void Call(){ Chat_Client CC = new Chat_Client(); } public static void main (String[] args){ Chat_Server cs = new Chat_Server(); String MessageIn = ""; try{ SS = new ServerSocket(1000); Socket S = SS.accept(); DIS = new DataInputStream(S.getInputStream()); DOS = new DataOutputStream(S.getOutputStream()); while (!MessageIn.equals("Stop the chat")){ MessageIn = DIS.readUTF(); textarea.setText(textarea.getText()+"\n"+MessageIn); } } catch(Exception e){ System.out.println("ERROR!!"); } } }

import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.ServerSocket; import java.net.Socket; public class Chat_Client extends JFrame implements ActionListener{ JButton Name = new JButton("Namn"); JButton Enter = new JButton("Enter"); JPanel jp1 = new JPanel(); JPanel jp2 = new JPanel(); JPanel jp3 = new JPanel(); static JTextArea textarea = new JTextArea(100,100); JTextField textfield = new JTextField(35); static ServerSocket SS; static Socket S; static DataInputStream DIS; static DataOutputStream DOS; public Chat_Client(){ jp1.add(Name); Name.addActionListener(this); jp2.add(textarea); jp3.setLayout(new FlowLayout()); jp3.add(textfield); jp3.add(Enter); add(jp1, BorderLayout.NORTH); add(jp2, BorderLayout.CENTER); add(jp3, BorderLayout.SOUTH); Enter.addActionListener(this); setSize(500,500); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); } public void actionPerformed(ActionEvent e){ String name; if(e.getSource()==Name){ name = JOptionPane.showInputDialog("Type your name"); String Kundname = name; } if(e.getSource()==Enter){ try{ String MessageOut= ""; MessageOut = textfield.getText(); DOS.writeUTF(MessageOut); }catch( Exception ex){ System.out.println("ERROR!"); } } } public static void main (String[] args){ Chat_Client cc = new Chat_Client(); String MessageIn = ""; try{ S = new Socket("127.0.0.1",1000); DIS = new DataInputStream(S.getInputStream()); DOS = new DataOutputStream(S.getOutputStream()); while (!MessageIn.equals("Stop the chat")){ MessageIn = DIS.readUTF(); textarea.setText(textarea.getText()+"\n"+MessageIn); } } catch(Exception e){ System.out.println("ERROR!!"); } } }

Problem är när man trycker på Enter knappen på både Server och Client , programmet visar Error! i kommandofönstret. Kan ni ge någon tips vad måste jag tänka för att lösa ?

Permalänk
Medlem

Att det skriver ut "ERROR" säger ju ingenting om vad felet är. Skriv istället ut stracktrace i catch-satserna tills programmet fungerar så att du ser var felet är (e.printStackTrace();).

Permalänk
Skrivet av Tazavoo:

Att det skriver ut "ERROR" säger ju ingenting om vad felet är. Skriv istället ut stracktrace i catch-satserna tills programmet fungerar så att du ser var felet är (e.printStackTrace();).

Tack! Jag har testat stacktrace, och kommandofönster visar mig
java.lang.NullPointerException
at Chat.Chat_Server.actionPerformed(Chat_Server.java:60)

at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6533)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6298)
at java.awt.Container.processEvent(Container.java:2236)
at java.awt.Component.dispatchEventImpl(Component.java:4889)
at java.awt.Container.dispatchEventImpl(Container.java:2294)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
at java.awt.Container.dispatchEventImpl(Container.java:2280)
at java.awt.Window.dispatchEventImpl(Window.java:2746)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Men jag tror det viktigt är linje 60 som java påpekar först
linje 60 är DOS.writeUTF(MessageOut);

Permalänk
Medlem
Skrivet av ProgrammeringElev:

java.lang.NullPointerException
at Chat.Chat_Server.actionPerformed(Chat_Server.java:60)

Du har helt rätt i att det är rad 60, "java.lang.NullPointerException tyder på att DOS är null. Testa att skapa S, SS, DOS, DIS i konstruktorn. Passa på och döp om de kryptiska namnen till mer beskrivande namn tex S skulle kunna heta "socket" eller "mSocket", det kommer hjälpa dig i framtiden.

//Fredrik

Permalänk
Skrivet av fp1:

Du har helt rätt i att det är rad 60, "java.lang.NullPointerException tyder på att DOS är null. Testa att skapa S, SS, DOS, DIS i konstruktorn. Passa på och döp om de kryptiska namnen till mer beskrivande namn tex S skulle kunna heta "socket" eller "mSocket", det kommer hjälpa dig i framtiden.

//Fredrik

Tack! Jag ska testa det kanske idag efter lunch!

Permalänk
Skrivet av fp1:

Du har helt rätt i att det är rad 60, "java.lang.NullPointerException tyder på att DOS är null. Testa att skapa S, SS, DOS, DIS i konstruktorn. Passa på och döp om de kryptiska namnen till mer beskrivande namn tex S skulle kunna heta "socket" eller "mSocket", det kommer hjälpa dig i framtiden.

//Fredrik

Men vad blir skillnad om jag skapar det i konstruktion? Ska inte main och actionListener visa error?

Permalänk
Medlem

Provade att köra ditt program.

Jag antar att du startar din klient genom att trycka på "Invite" knappen i fönstret för server, rätt? Problemet som uppstår när du gör det är att main() metoden i Chat_Client.java inte körs, därför ansluter aldrig klienten till server. Vilket i sin tur leder till att servern får aldrig någon i andra änden på sin socket och kan inte öppna en input/output-stream, därav NullPointerException när du försöker skriva till DOS.

Förslaget är som tidigare att flytta koden för att ansluta till server från din main-metod i Chat_Client till dess konstruktor istället kommer inte direkt fungera. Då tråden som körs när du klickar på "Invite" knappen blir låst till att köra klienten istället för att hantera nya actions i servern vilket i sin tur "låser" båda programmen.

Finns egentligen två lösningar:

1. Starta server och klient som två egna processer, dvs. starta inte klienten genom att trycka på "Invite" utan kör den direkt från din terminal eller IDE. När det körs som en egen process så kommer din main() metod kallas och eftersom den innehåller koden för anslutningen i klienten så kommer den ansluta.

2. Vill du hemskt gärna att "Invite" ska fungera så behöver du köra klienten i en egen tråd från servern. Se mitt exempel nedan:

Server:

import java.awt.*; import java.awt.event.*; import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.swing.*; public class Chat_Server extends JFrame implements ActionListener{ JButton jb1 = new JButton("Invite"); JButton Name = new JButton("Name"); JButton Enter = new JButton("Enter"); JPanel jp1 = new JPanel(); JPanel jp2 = new JPanel(); JPanel jp3 = new JPanel(); static JTextArea textarea = new JTextArea(25,40); JTextField textfield = new JTextField(35); static ServerSocket SS; static Socket S; static DataInputStream DIS; static DataOutputStream DOS; final ExecutorService threadExecutor = Executors.newSingleThreadExecutor(); public Chat_Server(){ jp1.setLayout(new FlowLayout()); jp1.add(jb1); jp1.add(Name); jb1.addActionListener(this); Name.addActionListener(this); jp2.add(textarea); jp3.setLayout(new FlowLayout()); jp3.add(textfield); jp3.add(Enter); add(jp1, BorderLayout.NORTH); add(jp2, BorderLayout.CENTER); add(jp3, BorderLayout.SOUTH); Enter.addActionListener(this); setSize(500,500); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); } public void actionPerformed(ActionEvent e){ String name; if(e.getSource()==jb1) Call(); if(e.getSource()==Name){ name = JOptionPane.showInputDialog("Type your name"); String Servername = name; } if(e.getSource()==Enter){ try{ String MessageOut= ""; MessageOut = textfield.getText(); DOS.writeUTF(MessageOut); }catch( Exception ex){ System.out.println("ERROR!"); } } } public void Call(){ Chat_Client CC = new Chat_Client(); threadExecutor.submit(CC); } public static void main (String[] args){ Chat_Server cs = new Chat_Server(); String MessageIn = ""; try{ SS = new ServerSocket(1337); Socket S = SS.accept(); DIS = new DataInputStream(S.getInputStream()); DOS = new DataOutputStream(S.getOutputStream()); while (!MessageIn.equals("Stop the chat")){ MessageIn = DIS.readUTF(); textarea.setText(textarea.getText()+"\n"+MessageIn); } } catch(Exception e){ System.out.println("ERROR!!"); } } }

Client:

import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.ServerSocket; import java.net.Socket; public class Chat_Client extends JFrame implements ActionListener, Runnable{ JButton Name = new JButton("Namn"); JButton Enter = new JButton("Enter"); JPanel jp1 = new JPanel(); JPanel jp2 = new JPanel(); JPanel jp3 = new JPanel(); static JTextArea textarea = new JTextArea(25,40); JTextField textfield = new JTextField(35); static ServerSocket SS; static Socket S; static DataInputStream DIS; static DataOutputStream DOS; public Chat_Client(){ jp1.add(Name); Name.addActionListener(this); jp2.add(textarea); jp3.setLayout(new FlowLayout()); jp3.add(textfield); jp3.add(Enter); add(jp1, BorderLayout.NORTH); add(jp2, BorderLayout.CENTER); add(jp3, BorderLayout.SOUTH); Enter.addActionListener(this); setSize(500,500); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); } public void actionPerformed(ActionEvent e){ String name; if(e.getSource()==Name){ name = JOptionPane.showInputDialog("Type your name"); String Kundname = name; } if(e.getSource()==Enter){ try{ String MessageOut= ""; MessageOut = textfield.getText(); DOS.writeUTF(MessageOut); }catch( Exception ex){ System.out.println("ERROR!"); } } } @Override public void run() { String MessageIn = ""; try{ S = new Socket("127.0.0.1",1337); DIS = new DataInputStream(S.getInputStream()); DOS = new DataOutputStream(S.getOutputStream()); while (!MessageIn.equals("Stop the chat")){ MessageIn = DIS.readUTF(); textarea.setText(textarea.getText()+"\n"+MessageIn); } } catch(Exception e){ System.out.println("ERROR!!"); } } }

Det som har ändrats är att Chat_Server nu har en ExecutorServer med 1 tråd, "threadExecutor", som kan användas för att exekvera kod i en egen tråd. Chat_Client implementerar därför Runnable och koden som var tidigare i main() finns nu i run() för att den ska kunna köras som en tråd.

Passade samtidigt på att ändra storleken på din textarea, som var 100x100 till 25x35 då den var alldeles för stor för fönstret. Porten är också ändrad till 1337 från 1000 då mitt OS inte verkade tycka om just port 1000.

Permalänk
Skrivet av taailyn.:

Provade att köra ditt program.

Jag antar att du startar din klient genom att trycka på "Invite" knappen i fönstret för server, rätt? Problemet som uppstår när du gör det är att main() metoden i Chat_Client.java inte körs, därför ansluter aldrig klienten till server. Vilket i sin tur leder till att servern får aldrig någon i andra änden på sin socket och kan inte öppna en input/output-stream, därav NullPointerException när du försöker skriva till DOS.

Förslaget är som tidigare att flytta koden för att ansluta till server från din main-metod i Chat_Client till dess konstruktor istället kommer inte direkt fungera. Då tråden som körs när du klickar på "Invite" knappen blir låst till att köra klienten istället för att hantera nya actions i servern vilket i sin tur "låser" båda programmen.

Finns egentligen två lösningar:

1. Starta server och klient som två egna processer, dvs. starta inte klienten genom att trycka på "Invite" utan kör den direkt från din terminal eller IDE. När det körs som en egen process så kommer din main() metod kallas och eftersom den innehåller koden för anslutningen i klienten så kommer den ansluta.

2. Vill du hemskt gärna att "Invite" ska fungera så behöver du köra klienten i en egen tråd från servern. Se mitt exempel nedan:

Server:

import java.awt.*; import java.awt.event.*; import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.swing.*; public class Chat_Server extends JFrame implements ActionListener{ JButton jb1 = new JButton("Invite"); JButton Name = new JButton("Name"); JButton Enter = new JButton("Enter"); JPanel jp1 = new JPanel(); JPanel jp2 = new JPanel(); JPanel jp3 = new JPanel(); static JTextArea textarea = new JTextArea(25,40); JTextField textfield = new JTextField(35); static ServerSocket SS; static Socket S; static DataInputStream DIS; static DataOutputStream DOS; final ExecutorService threadExecutor = Executors.newSingleThreadExecutor(); public Chat_Server(){ jp1.setLayout(new FlowLayout()); jp1.add(jb1); jp1.add(Name); jb1.addActionListener(this); Name.addActionListener(this); jp2.add(textarea); jp3.setLayout(new FlowLayout()); jp3.add(textfield); jp3.add(Enter); add(jp1, BorderLayout.NORTH); add(jp2, BorderLayout.CENTER); add(jp3, BorderLayout.SOUTH); Enter.addActionListener(this); setSize(500,500); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); } public void actionPerformed(ActionEvent e){ String name; if(e.getSource()==jb1) Call(); if(e.getSource()==Name){ name = JOptionPane.showInputDialog("Type your name"); String Servername = name; } if(e.getSource()==Enter){ try{ String MessageOut= ""; MessageOut = textfield.getText(); DOS.writeUTF(MessageOut); }catch( Exception ex){ System.out.println("ERROR!"); } } } public void Call(){ Chat_Client CC = new Chat_Client(); threadExecutor.submit(CC); } public static void main (String[] args){ Chat_Server cs = new Chat_Server(); String MessageIn = ""; try{ SS = new ServerSocket(1337); Socket S = SS.accept(); DIS = new DataInputStream(S.getInputStream()); DOS = new DataOutputStream(S.getOutputStream()); while (!MessageIn.equals("Stop the chat")){ MessageIn = DIS.readUTF(); textarea.setText(textarea.getText()+"\n"+MessageIn); } } catch(Exception e){ System.out.println("ERROR!!"); } } }

Client:

import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.ServerSocket; import java.net.Socket; public class Chat_Client extends JFrame implements ActionListener, Runnable{ JButton Name = new JButton("Namn"); JButton Enter = new JButton("Enter"); JPanel jp1 = new JPanel(); JPanel jp2 = new JPanel(); JPanel jp3 = new JPanel(); static JTextArea textarea = new JTextArea(25,40); JTextField textfield = new JTextField(35); static ServerSocket SS; static Socket S; static DataInputStream DIS; static DataOutputStream DOS; public Chat_Client(){ jp1.add(Name); Name.addActionListener(this); jp2.add(textarea); jp3.setLayout(new FlowLayout()); jp3.add(textfield); jp3.add(Enter); add(jp1, BorderLayout.NORTH); add(jp2, BorderLayout.CENTER); add(jp3, BorderLayout.SOUTH); Enter.addActionListener(this); setSize(500,500); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); } public void actionPerformed(ActionEvent e){ String name; if(e.getSource()==Name){ name = JOptionPane.showInputDialog("Type your name"); String Kundname = name; } if(e.getSource()==Enter){ try{ String MessageOut= ""; MessageOut = textfield.getText(); DOS.writeUTF(MessageOut); }catch( Exception ex){ System.out.println("ERROR!"); } } } @Override public void run() { String MessageIn = ""; try{ S = new Socket("127.0.0.1",1337); DIS = new DataInputStream(S.getInputStream()); DOS = new DataOutputStream(S.getOutputStream()); while (!MessageIn.equals("Stop the chat")){ MessageIn = DIS.readUTF(); textarea.setText(textarea.getText()+"\n"+MessageIn); } } catch(Exception e){ System.out.println("ERROR!!"); } } }

Det som har ändrats är att Chat_Server nu har en ExecutorServer med 1 tråd, "threadExecutor", som kan användas för att exekvera kod i en egen tråd. Chat_Client implementerar därför Runnable och koden som var tidigare i main() finns nu i run() för att den ska kunna köras som en tråd.

Passade samtidigt på att ändra storleken på din textarea, som var 100x100 till 25x35 då den var alldeles för stor för fönstret. Porten är också ändrad till 1337 från 1000 då mitt OS inte verkade tycka om just port 1000.

Tack så mycket!! Det fungerar jättebra!! Men på första frågan hur tror du om jag gör så?
Klass Server och Client blir separata som du har sagt, men på knappen invite, man gör metod Chatting_Client().setVisible(true) istället att anropa själv klass? I så fall, använder vi JButton invite för att prata med 4~5 fönstrar

Permalänk
Skrivet av taailyn.:

Provade att köra ditt program.

Jag antar att du startar din klient genom att trycka på "Invite" knappen i fönstret för server, rätt? Problemet som uppstår när du gör det är att main() metoden i Chat_Client.java inte körs, därför ansluter aldrig klienten till server. Vilket i sin tur leder till att servern får aldrig någon i andra änden på sin socket och kan inte öppna en input/output-stream, därav NullPointerException när du försöker skriva till DOS.

Förslaget är som tidigare att flytta koden för att ansluta till server från din main-metod i Chat_Client till dess konstruktor istället kommer inte direkt fungera. Då tråden som körs när du klickar på "Invite" knappen blir låst till att köra klienten istället för att hantera nya actions i servern vilket i sin tur "låser" båda programmen.

Finns egentligen två lösningar:

1. Starta server och klient som två egna processer, dvs. starta inte klienten genom att trycka på "Invite" utan kör den direkt från din terminal eller IDE. När det körs som en egen process så kommer din main() metod kallas och eftersom den innehåller koden för anslutningen i klienten så kommer den ansluta.

2. Vill du hemskt gärna att "Invite" ska fungera så behöver du köra klienten i en egen tråd från servern. Se mitt exempel nedan:

Server:

import java.awt.*; import java.awt.event.*; import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.swing.*; public class Chat_Server extends JFrame implements ActionListener{ JButton jb1 = new JButton("Invite"); JButton Name = new JButton("Name"); JButton Enter = new JButton("Enter"); JPanel jp1 = new JPanel(); JPanel jp2 = new JPanel(); JPanel jp3 = new JPanel(); static JTextArea textarea = new JTextArea(25,40); JTextField textfield = new JTextField(35); static ServerSocket SS; static Socket S; static DataInputStream DIS; static DataOutputStream DOS; final ExecutorService threadExecutor = Executors.newSingleThreadExecutor(); public Chat_Server(){ jp1.setLayout(new FlowLayout()); jp1.add(jb1); jp1.add(Name); jb1.addActionListener(this); Name.addActionListener(this); jp2.add(textarea); jp3.setLayout(new FlowLayout()); jp3.add(textfield); jp3.add(Enter); add(jp1, BorderLayout.NORTH); add(jp2, BorderLayout.CENTER); add(jp3, BorderLayout.SOUTH); Enter.addActionListener(this); setSize(500,500); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); } public void actionPerformed(ActionEvent e){ String name; if(e.getSource()==jb1) Call(); if(e.getSource()==Name){ name = JOptionPane.showInputDialog("Type your name"); String Servername = name; } if(e.getSource()==Enter){ try{ String MessageOut= ""; MessageOut = textfield.getText(); DOS.writeUTF(MessageOut); }catch( Exception ex){ System.out.println("ERROR!"); } } } public void Call(){ Chat_Client CC = new Chat_Client(); threadExecutor.submit(CC); } public static void main (String[] args){ Chat_Server cs = new Chat_Server(); String MessageIn = ""; try{ SS = new ServerSocket(1337); Socket S = SS.accept(); DIS = new DataInputStream(S.getInputStream()); DOS = new DataOutputStream(S.getOutputStream()); while (!MessageIn.equals("Stop the chat")){ MessageIn = DIS.readUTF(); textarea.setText(textarea.getText()+"\n"+MessageIn); } } catch(Exception e){ System.out.println("ERROR!!"); } } }

Client:

import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.ServerSocket; import java.net.Socket; public class Chat_Client extends JFrame implements ActionListener, Runnable{ JButton Name = new JButton("Namn"); JButton Enter = new JButton("Enter"); JPanel jp1 = new JPanel(); JPanel jp2 = new JPanel(); JPanel jp3 = new JPanel(); static JTextArea textarea = new JTextArea(25,40); JTextField textfield = new JTextField(35); static ServerSocket SS; static Socket S; static DataInputStream DIS; static DataOutputStream DOS; public Chat_Client(){ jp1.add(Name); Name.addActionListener(this); jp2.add(textarea); jp3.setLayout(new FlowLayout()); jp3.add(textfield); jp3.add(Enter); add(jp1, BorderLayout.NORTH); add(jp2, BorderLayout.CENTER); add(jp3, BorderLayout.SOUTH); Enter.addActionListener(this); setSize(500,500); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); } public void actionPerformed(ActionEvent e){ String name; if(e.getSource()==Name){ name = JOptionPane.showInputDialog("Type your name"); String Kundname = name; } if(e.getSource()==Enter){ try{ String MessageOut= ""; MessageOut = textfield.getText(); DOS.writeUTF(MessageOut); }catch( Exception ex){ System.out.println("ERROR!"); } } } @Override public void run() { String MessageIn = ""; try{ S = new Socket("127.0.0.1",1337); DIS = new DataInputStream(S.getInputStream()); DOS = new DataOutputStream(S.getOutputStream()); while (!MessageIn.equals("Stop the chat")){ MessageIn = DIS.readUTF(); textarea.setText(textarea.getText()+"\n"+MessageIn); } } catch(Exception e){ System.out.println("ERROR!!"); } } }

Det som har ändrats är att Chat_Server nu har en ExecutorServer med 1 tråd, "threadExecutor", som kan användas för att exekvera kod i en egen tråd. Chat_Client implementerar därför Runnable och koden som var tidigare i main() finns nu i run() för att den ska kunna köras som en tråd.

Passade samtidigt på att ändra storleken på din textarea, som var 100x100 till 25x35 då den var alldeles för stor för fönstret. Porten är också ändrad till 1337 från 1000 då mitt OS inte verkade tycka om just port 1000.

oj ignorera min sista inlägget om setVisible(true)!
Tack för svar!