Får ingen ordning på min chatt server.

Permalänk
Medlem

Får ingen ordning på min chatt server.

Hej, jag får ingen ordning på min chatt server. När jag startar servern så kan flera klienter ansluta och skicka meddelande till servern som servern sedan skickar tillbaka till klienten så det syns vad den skrivit. På servern syns då vad alla klienter skriver. Men jag servern skickar bara tillbaka det som skrivits till klienten som skrev det jag vill att den skall skicka ut det till alla anslutna klienter så att alla ser vad som skrivs. Någon som kan förstå var problemet ligger. Jag tror att jag gör så att den bara skickar det på den socketen som skrev det men den skall ta in det från en socker och sen skicka ut det på alla socketar. Väldigt tacksam för hjälp

Kod för servern.

package java14.network.thread.upg2; import java.net.*; import java.util.Scanner; import java.awt.event.*; import java.awt.*; import java.io.*; import javax.swing.*; public class Server extends JFrame implements ActionListener { private static JTextArea chattWindow; private JButton startServerButton; private JButton stopServerButton; private JPanel center, north, south, west, east; private JScrollPane scroll; private StartServer startServer; public Server() { setSize(500, 500); setLayout(new BorderLayout()); startServer = new StartServer(); center = new JPanel(); center.setLayout(new FlowLayout()); north = new JPanel(); south = new JPanel(); south.setLayout(new FlowLayout()); west = new JPanel(); east = new JPanel(); startServerButton = new JButton("Start Server"); startServerButton.addActionListener(this); stopServerButton = new JButton("Stop Server"); stopServerButton.addActionListener(this); chattWindow = new JTextArea(25, 35); chattWindow.setEnabled(false); scroll = new JScrollPane(chattWindow, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); center.add(scroll); south.add(startServerButton); south.add(stopServerButton); add(BorderLayout.CENTER, center); add(BorderLayout.SOUTH, south); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); } static class HandleClient extends Thread { private static Socket client; private String received; private PrintWriter output; private Scanner inScanner; public HandleClient(Socket socket) { //Här tror jag att mitt fel är att den skickar bara ut på den socketen som den accepterat. //men jag vill ju att den skall skicka ut på alla socketar den har kontakt med. //Så att det den får in skickas ut och syns för all anslutna clienter. client = socket; try { inScanner = new Scanner(client.getInputStream()); output = new PrintWriter(client.getOutputStream(), true); } catch (IOException ioEx) { ioEx.printStackTrace(); } } public void run() { do { received = inScanner.nextLine(); chattWindow.append(getName() + ": " + received + "\n"); output.println(getName() + ": " + received); } while (!received.equals("QUIT")); try { if (client != null) { chattWindow.append("Stänger ansluningen."); client.close(); } } catch (IOException ioEx) { chattWindow.append("Kunde inte stänga anslutningen."); } } } static class StartServer extends SwingWorker<Void, Void> { private static ServerSocket serverSocket; private static Socket client; @Override protected Void doInBackground() throws Exception { try { serverSocket = new ServerSocket(8843); } catch (IOException ioEx) { chattWindow.append("Kan inte öppna porten"); System.exit(1); } do { client = serverSocket.accept(); HandleClient handler = new HandleClient(client); chattWindow.append(handler.getName() + " anslöt sig till servern.\n"); handler.start(); } while (true); } } @Override public void actionPerformed(ActionEvent e) { if (e.getSource()==startServerButton) { startServer.execute(); } if (e.getSource()==stopServerButton) { } } }

Permalänk
Medlem

Varje gång du accepterar en ny anslutning serverSocket.accept() måste du spara undan alla dessa sockets eller i ditt fall blir det dina HandleClient. När en HandleClient får ett meddelande behöver denna rapportera till någon class som i sin tur kan säga till alla HandleClient att de ska skicka ett meddelande över dess socket.

Alltså en socket tillhör en anslutning, varje server - client anslutning har en egen Socket.