Java 将变量设置为客户端套接字
我正在制作一个Java TCP服务器,一个我无法解决的noob问题出现在我面前,如何将变量设置到当前客户端套接字?检查类处理程序,上面的代码可能并不重要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
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
(它可以是您自己的单例,在读取传入数据时可供所有线程访问),然后按请求参数(用户)检索所需的会话