0

I use two classes in my server

Myserver.java

private ExecutorService executorService = Executors.newFixedThreadPool(10);        

public static void main(String[] args) throws IOException {
  server = new MyServer();
  server.runServer();
}

private void runServer() {        
  int serverPort = 8071;
  try {
    System.out.println("Starting Server");
    serverSocket = new ServerSocket(serverPort); 

    while(true) {
      System.out.println("Waiting for request");
      try {
        Socket s = serverSocket.accept();
        System.out.println("Processing request");
        executorService.submit(new ServiceRequest(s));
      } catch(IOException ioe) {
        System.out.println("Error accepting connection");
        ioe.printStackTrace();
      }
    }
  }catch(IOException e) {
    System.out.println("Error starting Server on "+serverPort);
    e.printStackTrace();
  }
}

and

ServiceRequest.java

private Socket socket;
BufferedReader input = null;

public ServiceRequest(Socket connection) {
  this.socket = connection;
}

public void run() {

  try {
    //input = new BufferedReader(new InputStreamReader(socket.getInputStream()));


    DataInputStream din = new DataInputStream(socket.getInputStream());

    System.out.println("Client "+ clientID +"Connected");

    

I want to get the number of each Client in run() ( I want to get a result in the last line of the code ). How would I do this?

4

2 回答 2

2

当您创建一个新的服务请求时,您可以为 ID 保留一个全局计数器……但如果您想保留唯一的 ID,使用AtomicLong,而不是常规int或非常重要。long

private static AtomicLong idCounter = new AtomicLong();
private long clientId = idCounter.incrementAndGet();

这就是您可以以线程安全的方式创建s 的方式,因为每次生成 a 时clientId,实例变量都会自动创建一个新值。clientIdServiceRequest

于 2013-05-02T16:18:08.407 回答
0

每次调用 run() 时,它都应该位于 type 的新对象上ServiceRequest。当它们被实例化时,您可以为它们中的每一个分配一个唯一的 clientID。

这在 java 中可能行不通,但很容易实现类似的功能。在ServiceRequest添加这些行:

private static int counter = 0;
protected int clientID = counter++;

这意味着每次ServiceRequest创建 a 时,它的成员变量 clientID 都会比前一个大一。它不是线程安全的,但我认为 java 有一些volatile可能会起作用的东西。

于 2013-05-02T16:14:58.863 回答