2017-08-19 2 views
-1

Ich schreibe ein Java-Socket-Programm zum Senden von JSON-Objekt von einem Client an einen anderen Client. Jetzt teste ich es einfach durch Senden von String-Daten, die von der Konsole eingegeben werden. Wenn ich etwas in die Konsole eintippe und es an den Server sende, sollte der Server dies ausdrucken und an den Client zurücksenden, dann sollte der Client das auch ausdrucken. Aber mein Server-Programm zeigt nichts in der Konsole an, auch nicht der Client. Ich kann nicht finden, wo das Problem ist.Java-Socket kann Daten nicht an Server senden

Server:

public class GameServer { 
private Socket socket; 
private ServerSocket serverSocket; 
private ArrayList<GameServerThread> threads; 

public GameServer(){ 
    try{ 
     //Create new server socket 
     serverSocket = new ServerSocket(1234,100); 
     System.out.println("Waiting for clients ..."); 
     threads = new ArrayList<GameServerThread>(); 
     //Receive request from client 
     while(true){ 
      socket = serverSocket.accept(); 
      //Create new Thread once receive a request 
      new Thread(new GameServerThread(socket, this)).start();  
     } 

    }catch(IOException e){ 
     System.out.println("Failed to create socket!"); 
     e.printStackTrace(); 
    }finally{ 
     try { 
      serverSocket.close(); 
     } catch (IOException e) {    
      e.printStackTrace(); 
     } 
    }  
} 



public ArrayList<GameServerThread> getAllThreads(){ 
    return this.threads; 
} 


public void addNewThread(GameServerThread t){ 
    this.threads.add(t); 
} 



public static void main(String args[]){ 
    GameServer server = new GameServer(); 
} 
} 

Serverthread:

public class GameServerThread extends Thread{ 
private Socket socket; 
private GameServer server; 
private OutputStreamWriter writer; 
private BufferedReader reader; 
String userName; 

public GameServerThread(Socket s, GameServer srv) throws UnsupportedEncodingException, IOException{ 
    System.out.println("Succeeded to connect with one client!"); 
    this.socket = s; 
    this.server = srv; 
    writer = new OutputStreamWriter(this.socket.getOutputStream(), "UTF-8"); 
    reader = new BufferedReader(new InputStreamReader(this.socket.getInputStream(), "UTF-8")); 
    this.server.addNewThread(this); 
} 


public void run(){ 
    try{ 
     while(true){ 
      receive(); 
     } 
    }catch(SocketException e){ 
     e.printStackTrace(); 
    }catch(IOException e){ 
     e.printStackTrace(); 
    }finally{  
     try { 
      this.socket.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 


private void receive() throws IOException{ 
    String str = null; 
    while((str=reader.readLine()) != null){ 
     System.out.println(str); 
     sendToOther(str);  } 
} 


public void send(String msg){ 
    try{ 
     writer.write(msg); 
     writer.flush(); 
    }catch(IOException e){ 
     e.printStackTrace(); 
    } 
} 


private void sendToOther(String msg){ 
    for(GameServerThread thread: this.server.getAllThreads()){ 
     //if(!thread.equals(this)){ 
      thread.send(msg); 
     //} 
    } 
} 

Auftraggeber:

public class GameClient { 
private Socket socket; 
private String serverIP; 
private OutputStreamWriter writer; 
private BufferedReader reader; 

public GameClient(String host){ 
    this.serverIP = host; 

    try{ 
     //Connect to server 
     socket = new Socket(InetAddress.getByName(serverIP), 1234); 
     writer = new OutputStreamWriter(this.socket.getOutputStream(), "UTF-8"); 
     reader = new BufferedReader(new InputStreamReader(this.socket.getInputStream(), "UTF-8")); 
     //Start a new thread for reading from server 
     new Thread(new GameClientThread(socket)).start(); 

     Scanner scanner = new Scanner(System.in); 
     System.out.println("Write something: "); 
     String str = ""; 
     while((str = scanner.nextLine()) != null){ 
      writer.write(str); 
      writer.flush(); 
      System.out.println("Write something: "); 
     } 
    }catch(IOException e){ 
     System.out.println("Client failed to connect!"); 
     e.printStackTrace(); 
} 
} 

Client-Thread:

public class GameClientThread extends Thread{ 
private Socket socket; 
private BufferedReader reader; 

//private OutputStreamWriter writer; 
//private String userName = ""; 

public GameClientThread(Socket soc){ 
    this.socket = soc; 

    try{ 
     reader = new BufferedReader(new InputStreamReader (this.socket.getInputStream(), "UTF-8")); 
    }catch(IOException e){ 
     e.printStackTrace(); 
    } 


} 


public void run(){ 
    while(true){ 
     receive(); 
    } 
} 


private void receive(){ 
    String msg; 
    try { 
     msg = reader.readLine(); 
     System.out.println(msg); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
} 
+0

Sorry, so funktioniert StackOverflow nicht. Fragen der Form _ "Hier ist ein Haufen von meinem Code, es funktioniert nicht, kann jemand mir helfen, es herauszufinden" _ sind als Off-Topic. Bitte besuche [help] und lies [ask] für weitere Informationen, und lese besonders [Warum ist "Kann mir jemand helfen?" Keine wirkliche Frage?] (Http://meta.stackoverflow.com/q/284236/18157) –

Antwort

0

BufferedReader.readLine erwartet eine neue Zeile (\ n, \ r oder \ r \ n) am Ende jeder Zeile, aber Sie schreiben beim Schreiben von Daten keine neue Zeile. Fügen Sie jedes Mal, wenn Sie eine Zeichenfolge schreiben, die nicht bereits in einer neuen Zeile endet, eine writer.write('\n'); hinzu.

+0

Was bedeutet "Stunting Daten"? –

+0

@ Jim danke. Liebst du nicht Handy Autokorrektur ... –