05. marts 2013 - 00:16Der er
25 kommentarer og 1 løsning
Socket program - flere Clients til en server
Er ny til socket programmering i java og har lidt problemer i forb. med at have flere "Client's" forbundet til en server, som skal have mulighed for at skrive til hinanden.
Jeg har et program hvor server og client kan skrive til hinanden efter tur (TCP), men kan ikke finde logikken i det og få lavet det andet. En løsning og forklaring på dette ville være en virkelig stor hjælp.
Naar du accepterer en connection, saa gemmer du en referance til et objekt som haandterer den klient. Saa har du mulighed for at skrive til alle klienter eller for at finde en ebstemty klient frem hvis der skal skrives til en enkelt.
har forsøgt mig arraylist osv for at gøre det muligt at tilgå flere klienter.. Har en nullpointerexception fejl lige nu og ved ikke helt hvorfor, kan ikke finde ud af hvad der er galt.
public static void main(String argv[]) throws Exception { System.out.println("starting main"); welcomeSocket = new ServerSocket(9876); System.out.println("Server socket klar");
inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
// Laver sockets til hver enkel Client (accepterer) threadClients = new Thread(new Runnable() { public void run() { while(go_on) { try { connectionSocket = welcomeSocket.accept(); clientsArray.add(connectionSocket); } catch (IOException e) { e.printStackTrace(); } } } }); threadClients.start();
// Traad til at skrive til samtlige clients threadWriteToClients = new Thread(new Runnable() { public void run() { while(go_on) { try { sentence = inFromClient.readLine(); for (int i = 0; i <= clientsArray.size(); i++) { outToClient = new DataOutputStream(clientsArray.get(i).getOutputStream()); outToClient.writeBytes("FROM SOME CLIENT: " + sentence + "\n"); }
} catch (Exception e) { e.printStackTrace(); }
} } }); threadWriteToClients.start();
// SERVER kommandoer (gaar ogsaa ud til clients) threadServerCommands = new Thread(new Runnable() { public void run() { BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); while(go_on) { try { serverCMD = inFromUser.readLine(); for (int i = 0; i <= clientsArray.size(); i++) { outToClient = new DataOutputStream(clientsArray.get(i).getOutputStream()); outToClient.writeBytes(serverCMD + "\n"); }
if (serverCMD.equals("quit")) { go_on = false; System.out.println("quitting the loop and closing the socket"); connectionSocket.close(); welcomeSocket.close(); }
} catch (IOException e) { e.printStackTrace(); }
} } }); threadServerCommands.start();
}
}
FEJL MEDD: starting main Server socket klar Exception in thread "main" java.lang.NullPointerException at TCPServer.main(TCPServer.java:32)
linje 32 er: inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
ahh ja selvfølgelig! har rykket rundt på det så har ingen fejl i mit program nu.. men kan ikke se beskeder fra andre clients når jeg kører det og prøver at skrive beskeder. har du en idé om hvor fejlen kan ligge. er rimelig blank her :/
hvis jeg fjerne accept fra threadWriteToClients laver den en nullpointerexception på linje 57 som er: sentence = inFromClient.readLine();
Hvis jeg skal bruge PrintStream i stedet for, hvad skal jeg så skrive i min write? der står at den skal have "byte" som input.. kan ikke skrive følgende da det giver en syntakst fejl: outToClient = new PrintStream(clientsArray.get(i).getOutputStream()); outToClient.write( "FROM SOME CLIENT: " + sentence + "\n");
hmm okay.. hvis jeg fjerne static så der kun står private inFromClient som global variabel, klager eclipse og siger at den skal være static.. jeg droppede den så helt som global variabel og smed den ned i tråden "threadWritToClients" så der nu står:
og hvis jeg fjerne den får jeg nullpointerexception: java.lang.NullPointerException at TCPServer$2.run(TCPServer.java:56) at java.lang.Thread.run(Unknown Source)
linje 56: BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
okay jeg troede jeg havde fundet en løsning, men det viste sig også at være galt.. min for løkke i threadWriteToClients ser nu sådan ud:
for (int i = 0; i < clientsArray.size(); i++) { connectionSocket = clientsArray.get(i); BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); sentence = inFromClient.readLine(); outToClient = new PrintStream(clientsArray.get(i).getOutputStream()); outToClient.println("FROM SOME CLIENT: " + sentence + "\n"); outToClient.flush(); }
Den opfører sig bare lidt mærkeligt nu.. når jeg køre to clients op mod serveren skriver den de fleste gange den besked man lige har indtastet så man selv kan se den (andre klienter kan ikke se den) og nogle gange står der "FROM SOME CLIENT" foran, men ikke hver gang.. ?? Og ind imellem laver den linje skift hos den anden klient når man indtaster en besked.. men det er også kun nogle gange. hara virkelig ingen ide om hvorfor den gør dette?
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.