Problem med java (sockets och lite sånt)

Permalänk
Medlem

Problem med java (sockets och lite sånt)

Hejsan!
Det är så att jag håller på att skriva ett enkelt program som ska göra så att upp till 30 personer ska kunna chata med varandra, (tänk irc). Mitt problem är det att den gör sakerna uppifrån och ner, så först lyssnar den efter en uppkoppling och accepterar den,
sen så hämtar den alla medeelanden och skickar dem till alla andra.
Men nu är det så att den inte fortsätter programet förens någon kopplar upp sig, detta tänkte jag lösa genom att ha en tråd som lyssnar efter uppkopplingar och accepterar dem och en som skickar och tar emot data. Men jag vet inte riktigt hur jag ska göra, någon som skulle kunna hjälpa mig?
Så här ser koden ut för tillfället:

import java.util.*; import java.io.*; import java.net.*; public class chatServer{ public static void main(String args[]){ ServerSocket server; tradChat[] anvandare = new tradChat[30]; Socket[] klienter = new Socket[30]; int antAnvandare = 0; String[] mess = new String[30]; Thread lyssna; try{ server = new ServerSocket(5999); while(true){ klienter[antAnvandare] = server.accept(); anvandare[antAnvandare] = new tradChat(klienter[antAnvandare]); antAnvandare++; System.out.println("Ny klient, antal klienter nu: "+antAnvandare); for(int i = 0; i < antAnvandare; i++){ //Hämta medeelanden från alla användare mess[i] = anvandare[i].getMess(); System.out.println("medelande: " +mess[i]); if(mess[i].compareTo("") != 0){ if(mess[i].indexOf("/q", 0) != -1){ anvandare[i].avsluta("You have exit"); antAnvandare--; try{ klienter[i].close(); } catch (Exception e){ System.err.println(e); } } } } //System.out.println("hämtat medeelandena"); for(int j = 0; j < antAnvandare; j++){ //Loopa igenom alla användare och skicka alla medeelanden till alla (om de innehåller något vettigt) for(int g = 0; g < antAnvandare; g++){ if(mess[g].compareTo("") != 0 && mess[g].compareTo("/f") != 0){ anvandare[j].sendMess(mess[g]); } } } for(int l = 0; l < antAnvandare; l++){ mess[l] = ""; } //System.out.println("Tömt medelandena"); }} catch(Exception e){ System.err.println(e); } } }

Och jag är medveten om att den ser förjävlig ut

Visa signatur

ERx -> Alltid Trött IWill KK400-RS | Athlon Xp 2000+ | 256mb ddr | 48x cdrw | Samsung dvd | Nec ND-1300A DVD+-RW | GF4Mx440 128mb | Wd 80GB + Ibm/Hitachi 120Gb | Tvkort
"Fascism är den enda ideologin som fungerar" - Koffe

Permalänk
Medlem

Lägg bara koden i en klass som ärver från Thread..ungefär såhär:

class ServerThread extends Thread { public ServerThread() { // Lite initiering osv kanske start(); } public void run() { while(true) { // Lyssna efter nya anslutningar osv } } }

start() metoden gör att tråden "startar". Då körs run-metoden. Genom att ha en while(true) sats där kommer metoden fortsätta att köras hela tiden.

Sedan får du t, ex ha en tråd för varje användare, den kan se ungefär likadan ut. I while-loopen får du lägga kod som tar emot data. När sedan datan mottagits kan tråden säga till "huvudprogrammet" att den fått data..osv

Visa signatur

Real Programmers always confuse Christmas and Halloween because OCT 31 == DEC 25 !

Permalänk
Medlem

Så här ser main-metoden ut i servern till en grej jag kodade häromkursen.

Om du vill ha mer sammanhang kan du titta på
http://stp.ling.uu.se/~henrikn/java/om/
http://stp.ling.uu.se/~henrikn/java/om/src/LettersServer.java

Jag garanterar inte att koden är snygg/effektiv/säker, men den fungerar.

/** Etablerar anslutning till databasen och lyssnar efter klienter. Varje klient knoppas av till en {@link LettersClientHandler}. */ public static void main(String args[]) { // Anslut till databasen. db = new LettersDatabase("letters.db"); try { // Lyssna efter inkommande anslutningar. serverSocket = new ServerSocket(port); String s = InetAddress.getLocalHost().getHostName(); System.out.println("LettersServer på " + s + ":" + port + " har startat."); System.out.println("Lyssnar efter anslutningar..."); } catch (Exception e) { // Avsluta om något gick fel vid starten. System.out.println("LettersServer kunde inte starta: "+e); System.exit(1); } try { // Fånga varje inkommande anslutning och knoppa av den till en egen tråd. while(true) { Socket clientSocket = serverSocket.accept(); System.out.println("Klient " + clientNum + " har anslutit."); clients.add(new LettersClientHandler(clientSocket, clientNum++)); // Öka räknaren för anslutna klienter. numClients++; System.out.println("Nu är "+numClients+" klient"+(numClients == 1 ? " ansluten" : "er anslutna")+"."); } } catch (IOException e) { // Meddela om något gick fel vid avknoppningen. System.out.println("FEL: Kunde inte ta emot klient "+clientNum+"!"); } }

Permalänk
Medlem

Okej, jag har skrivit om servern nu så att varje användare har en tråd. Men problemet är nu att så fort jag har skickat nicket så får jag java.lang.NullPointerException på klientsidan :S kan nån se om det finns nått fel på den här koden som skulle orsaka detta?:

import java.net.*; import java.util.*; import java.io.*; public class chatClient{ public static void main(String args[]){ String servern; Socket klient = null; PrintStream os = null; DataInputStream is = null; String sendMess, nick; String[] mess = new String[30]; int xMess = 0; System.out.print("Vilken Server? "); servern = Keyboard.readString(); try{ klient = new Socket(servern, 5999); os = new PrintStream(klient.getOutputStream()); is = new DataInputStream(klient.getInputStream()); System.out.print("nick: "); nick = Keyboard.readString(); os.println(nick); os.println("Klienten här!"); while(true){ mess[xMess] = is.readLine(); while(mess[xMess].compareTo("") != 0){ System.out.println(mess[xMess]); mess[xMess] = ""; xMess++; } System.out.print("Vad vill du skicka? "); os.println(Keyboard.readString()); } } catch (Exception e){ System.err.println(e); } } }

Visa signatur

ERx -> Alltid Trött IWill KK400-RS | Athlon Xp 2000+ | 256mb ddr | 48x cdrw | Samsung dvd | Nec ND-1300A DVD+-RW | GF4Mx440 128mb | Wd 80GB + Ibm/Hitachi 120Gb | Tvkort
"Fascism är den enda ideologin som fungerar" - Koffe

Permalänk
Medlem

vilken rad får du exception på?

Visa signatur

Real Programmers always confuse Christmas and Halloween because OCT 31 == DEC 25 !