2013-12-02 3 views
1

Я делаю Java-сервер TCP и вопрос о том, что я не могу вращаться, пришел ко мне, как установить переменные в текущий клиентский сокет? Проверьте класс Handler, код выше может быть неважным.Установить переменные на клиентский сокет

import java.io.*; 
import java.net.*; 
import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.logging.Handler; 

public class tcp_server { 
    public static void main(String[] args) { 
    int count = 0; 

    ExecutorService executor = Executors.newFixedThreadPool(30); 
    Socket client; 

    try { 
     ServerSocket server = new ServerSocket(8080); 

     while(true) { 
     client = server.accept(); 
     executor.execute(new Handler(client)); 
     } 
    } 
    catch(Exception e) { 
     System.out.println(e); 
    } 
    } 

    public static class Handler implements Runnable { 
    private Socket client; 

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

    public void run() { 
     try { 
     BufferedReader inFromClient = new BufferedReader(new InputStreamReader(client.getInputStream())); 
     DataOutputStream outToClient = new DataOutputStream(client.getOutputStream()); 
     String event = inFromClient.readLine(); 
     System.out.println(event); 

     // Arrays.copyOfRange(byte[] original, int from, int to) 

     // Index 
     if(event.equals("GET/HTTP/1.1")) { 
      // ... 
      client.close(); 
     } 

     // Authenticate 
     if(event.charAt(0) == '0') { 
      String client_token = Arrays.copyOfRange(byte[] event, int 1, 33); 

      // I'm gonna add the MySQL Queries later 

      // if session id found on table 
      String client_google = "000000000000000000000"; // MySQL 
      client.session = client_token; // -> Token received from client. (?) 
      client.gid = client_google; // -> Google+ Profile (?) 
      // **How do I set variables to the current client?** 
     } 

     // Sync settings 
     if(event.charAt(0) == '0') { 
      // ... 
      // access non static variable from here 
      System.out.println(client.session); // (?) 
      System.out.println(client.gid); // (?) 
     } 

     // More events 
     } 
     catch(Exception e) { 
     System.out.println(e); 
     } 
    } 
    } 

    // End. 
} 

Спасибо.

ответ

1

Есть несколько способов хранения данных локально для вашего конкретного соединения. В вашем примере самый простой способ будет объявить сессионный-переменную, которая является полем Хэндлер, что-то вроде:

UserSession может содержать то, что вы хотите. Другим вариантом является то, что класс UserSession обменивается на Map<String, Object>, который будет содержать сопоставления значений ключа, локальные для этого пользовательского подключения. Недостатки: если ваша система растет, вам нужно будет передать ссылку на этот сеанс всем методам, которым нужны данные сеанса.

До тех пор, пока вы используете блокировку ввода-вывода для ввода данных, вы также можете использовать такой класс, как ThreadLocal, который выходит из коробки с помощью java. Этот механизм делает то же самое, что и ваша локальная переменная UserSession, ваша переменная сеанса будет доступна в любой части вашего кода, если она выполняется 1 потоком (что является фактом блокировки IO). Вы можете прочитать об этом здесь:

http://docs.oracle.com/javase/7/docs/api/java/lang/ThreadLocal.html

Наконец, последний способ - неблокируемый потоки пул HTTP способ - отправить идентификатор сеанса при каждом запросе, СТГ как user=login. Затем сохраните большой файл Map<String, UserSession> в контексте приложения (он может быть вашим собственным синглом, доступным для всех потоков при чтении входящих данных), а затем получить требуемый сеанс по параметру запроса (пользователю).

Смежные вопросы