2016-09-24 125 views
0

所以我希望服务器向客户端发送消息,然后客户端在客户端收到消息时做某些事情,但客户端没有收到消息或服务器不发送消息。我不知道为什么。我做在线程的聊天记录,但首先,这里的ServerClass:Java聊天不起作用 - 客户端没有收到消息

public class CommandServer { 

private ServerSocket server; 
private Socket client; 
private PrintWriter writer; 
private BufferedReader reader; 
public static List<Gamemode> cache = new LinkedList<>(); 

public CommandServer() {} 

public void start(){ 
    try{ 
     server = new ServerSocket(3); 
     System.out.println(Master.prefix + "Commander started!"); 

     client = server.accept(); 
     System.out.println(Master.prefix + "Watcher accepted!"); 

     writer = new PrintWriter(client.getOutputStream()); 
     reader = new BufferedReader(new InputStreamReader(client.getInputStream())); 

     client.setKeepAlive(true); 

     Thread thread = new Thread(new Threader(reader)); 
     thread.start(); 

     startNew(Gamemode.BEISPIEL); 
     System.out.print(Master.prefix + "Send StartCommand!"); 
    }catch(Exception ex){ 

    } 
} 

public void startNew(Gamemode gm){ 
    cache.add(gm); 
    writer.write("STARTNEW => " + gm.toString()); 
    writer.flush(); 
} 

}

和线程的服务器:

public class Threader implements Runnable{ 

private BufferedReader reader; 

public Threader(BufferedReader reader) { 
    this.reader = reader; 
} 

@Override 
public void run() { 
    while(true){ 
     String s = null; 
     try { 
      while((s = reader.readLine()) != null){ 
       if(s.startsWith("STARTED")){ 
        String uuid = s.split(" => ")[1]; 
        if(Master.register.getRegisterStatus(UUID.fromString(uuid)) == RegisterStatus.NEW){ 
         if(CommandServer.cache.contains(Master.register.getGamemode(UUID.fromString(uuid)))){ 
          CommandServer.cache.remove(Master.register.getGamemode(UUID.fromString(uuid))); 
          Master.register.setRegistered(UUID.fromString(uuid)); 
          Master.servers.add(Master.register.getGamemode(UUID.fromString(uuid)), Master.register.getPort(UUID.fromString(uuid))); 
         } 
        } 
       } 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

}

而且现在的客户:

public class Watcher { 

private Socket client; 
private PrintWriter writer; 
private BufferedReader reader; 
public static List<Thread> runningServers = new LinkedList<>(); 

public Watcher() {} 

public void start(){ 
    try { 
     client = new Socket("localhost", 3); 
     System.out.println(Daemon.prefix + "Watcher started and connected!"); 
     writer = new PrintWriter(client.getOutputStream()); 
     reader = new BufferedReader(new InputStreamReader(client.getInputStream())); 

     client.setKeepAlive(true); 

     Thread thread = new Thread(new Threader(reader)); 
     thread.start(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 

public void started(String uuid){ 
    writer.write("STARTED => " + uuid); 
    writer.flush(); 
} 

}

以及客户端的版本:

public class Threader implements Runnable{ 

private BufferedReader reader; 

public Threader(BufferedReader reader) { 
    this.reader = reader; 
} 

@Override 
public void run() { 
    try { 
     boolean b = true; 
     while (b == true) { 
      String s = null; 
      while ((s = reader.readLine()) != null) { 
       if(s.startsWith("STARTNEW")){ 
        System.out.println(Daemon.prefix + "Recieved!"); 
        Gamemode gm = Gamemode.valueOf(s.split(" => ")[1]); 
        ThreadHandler handler = new ThreadHandler(gm); 
        Thread thread = new Thread(handler); 
        thread.start(); 
        Watcher.runningServers.add(thread); 
       } 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

}

为什么不接收客户端的消息?

+0

'new ServerSocket(3)':3 - 是端口号。因此,至少它必须大于1024.因为0-1023是已知的“注册端口” –

+0

好的,我改变了它,但没有任何反应,客户端没有收到消息 – RageSkilln

回答

0

尝试使用4位数的端口号码,例如'6789'。如果它没有帮助,你应该自己编写服务器和客户端类,这将有助于你完全理解问题。对于1客户端 - 1服务器通信,我推荐here的简单示例。对于多个客户端 - 1服务器通信check this out