2014-10-19 75 views
0

我想调用一个函数cycle(),该函数每x秒钟执行一次操作。
此时我只能在客户有请求时才能打电话。如何在Runnable中使用Java Socket

public class ChatServer implements Runnable { 

    private static final int PORT = 9001; 
    private static HashSet<String> names = new HashSet<String>(); 
    private static HashSet<PrintWriter> writers = new HashSet<PrintWriter>(); 

    public static void main(String[] args) throws Exception { 
     System.out.println("The chat server is running."); 
     ServerSocket listener = new ServerSocket(PORT); 
     try { 
      while (true) { 
       new Handler(listener.accept()).start(); 
      } 
     } finally { 
      listener.close(); 
     } 
    } 

    private static class Handler extends Thread { 
     private String name; 
     private Socket socket; 
     private BufferedReader in; 
     private PrintWriter out; 

     public Handler(Socket socket) { 
      this.socket = socket; 
     } 

     public void run() { 

      cycle();   

      try { 

       in = new BufferedReader(new InputStreamReader(
        socket.getInputStream())); 
       out = new PrintWriter(socket.getOutputStream(), true); 

       while (true) { 
        out.println("SUBMITNAME"); 
        name = in.readLine(); 
        if (name == null) { 
         return; 
        } 
        synchronized (names) { 
         if (!names.contains(name)) { 
          names.add(name); 
          break; 
         } 
        } 
       } 

       out.println("NAMEACCEPTED"); 
       writers.add(out); 
       while (true) { 
        String input = in.readLine(); 
        if (input == null) { 
         return; 
        } 
        for (PrintWriter writer : writers) { 
         writer.println("MESSAGE " + name + ": " + input); 
        } 
       } 
      } catch (IOException e) { 
       System.out.println(e); 
      } finally { 

       if (name != null) { 
        names.remove(name); 
       } 
       if (out != null) { 
        writers.remove(out); 
       } 
       try { 
        socket.close(); 
       } catch (IOException e) { 
       } 
      } 
     } 
    } 
} 

是的,下面的代码是工作时,我从我的代码中删除Handle类。
我的问题是我不能将它们结合在一起,请帮助或建议。非常感谢。

private void cycle() { 

    //do something 
} 

@Override 
public void run() { 

    long beforeTime, timeDiff, sleep; 

    beforeTime = System.currentTimeMillis(); 

    while (true) { 

     cycle(); 

     timeDiff = System.currentTimeMillis() - beforeTime; 
     sleep = DELAY - timeDiff; 

     if (sleep < 0) { 
      sleep = 2; 
     } 

     try { 
      Thread.sleep(sleep); 
     } catch (InterruptedException e) { 
      System.out.println("Interrupted: " + e.getMessage()); 
     } 

     beforeTime = System.currentTimeMillis(); 
    } 
} 

回答

-1

您是否尝试在调用侦听套接字之前为循环函数启动一个单独的线程。

public static void main(String[] args) throws Exception { 
    System.out.println("The chat server is running."); 
    //start separate thread to keep loop.... 
    new Thread(new ChatServer()).start(); 
    ServerSocket listener = new ServerSocket(PORT); 
    try { 
     while (true) { 
      new Handler(listener.accept()).start(); 
     } 
    } finally { 
     listener.close(); 
    } 
} 
+0

这是一个问题,而不是答案。你必须在评论中询问Marcus。 – Ihsan 2014-10-27 16:07:45