Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将变量设置为客户端套接字_Java_Sockets - Fatal编程技术网

Java 将变量设置为客户端套接字

Java 将变量设置为客户端套接字,java,sockets,Java,Sockets,我正在制作一个Java TCP服务器,一个我无法解决的noob问题出现在我面前,如何将变量设置到当前客户端套接字?检查类处理程序,上面的代码可能并不重要 import java.io.*; import java.net.*; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ExecutorService; import ja

我正在制作一个Java TCP服务器,一个我无法解决的noob问题出现在我面前,如何将变量设置到当前客户端套接字?检查类处理程序,上面的代码可能并不重要

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.
}

谢谢。

有几种方法可以将数据存储到特定连接的本地。 在您的示例中,最简单的方法是声明一个会话变量,它是处理程序的字段,类似于:

public static class Handler implements Runnable {
    private Socket client;  
    private UserSession session;

    public Handler(Socket client) {
      this.client = client;
      this.session = new UserSession();
    }
 ...
UserSession
可以包含您想要的内容。另一个选项是将UserSession类交换为
Map
,这将保存此用户连接的本地键值映射。缺点:如果系统增长,则必须将对此会话的引用传递给所有需要会话数据的方法

只要您对数据输入使用阻塞IO,您也可以使用像
ThreadLocal
这样的类,它是java的开箱即用的。此机制与局部变量
UserSession
的作用相同,只要会话变量由一个线程运行(这是阻止IO的事实),就可以在代码的任何部分访问它。您可以在此处阅读:


最后一种方式——非阻塞线程池HTTP方式——在每个请求中发送会话标识符,类似于
user=login
。接下来,在应用程序上下文中存储一个大的
Map
(它可以是您自己的单例,在读取传入数据时可供所有线程访问),然后按请求参数(用户)检索所需的会话

有几种方法可以将数据存储到特定连接的本地。 在您的示例中,最简单的方法是声明一个会话变量,它是处理程序的字段,类似于:

public static class Handler implements Runnable {
    private Socket client;  
    private UserSession session;

    public Handler(Socket client) {
      this.client = client;
      this.session = new UserSession();
    }
 ...
UserSession
可以包含您想要的内容。另一个选项是将UserSession类交换为
Map
,这将保存此用户连接的本地键值映射。缺点:如果系统增长,则必须将对此会话的引用传递给所有需要会话数据的方法

只要您对数据输入使用阻塞IO,您也可以使用像
ThreadLocal
这样的类,它是java的开箱即用的。此机制与局部变量
UserSession
的作用相同,只要会话变量由一个线程运行(这是阻止IO的事实),就可以在代码的任何部分访问它。您可以在此处阅读:

最后一种方式——非阻塞线程池HTTP方式——在每个请求中发送会话标识符,类似于
user=login
。接下来,在应用程序上下文中存储一个大的
Map
(它可以是您自己的单例,在读取传入数据时可供所有线程访问),然后按请求参数(用户)检索所需的会话