gpt4 book ai didi

java - 有没有一种方法可以仅在Java套接字中从服务器向一个客户端发送消息?

转载 作者:行者123 更新时间:2023-12-01 18:38:49 25 4
gpt4 key购买 nike

我正在尝试构建服务器和客户端应用程序。客户端将登录数据(电子邮件和密码)发送到服务器。然后服务器会响应客户端登录数据是否正确。问题是我希望服务器仅响应仅发送登录数据的客户端。请注意,我希望保持类方法的通用性,以便我可以在 GUI (Javafx) Controller 类上使用它们。我怎样才能实现这个目标?

public class ServerConnector extends Thread{

public static final int PORT_NO = 5005;
private ServerSocket serverSocket;

/**
* Starts the server
*/
public void startServer() {
this.start();
}

@Override
public void run() {
Socket clientSocket;
try {
serverSocket = new ServerSocket(PORT_NO);
while (true) {
clientSocket = serverSocket.accept();
new ClientHandler(clientSocket);
}

} catch (IOException ex) {
ex.printStackTrace();
}
}
}
public class ClientHandler extends Thread {

private DataInputStream dis;
private PrintStream ps;
private Socket clientSocket;


public static Vector<ClientHandler> clientThreads = new Vector<ClientHandler>();

public ClientHandler(Socket s) {
try {
this.clientSocket = s;
dis = new DataInputStream(clientSocket.getInputStream());
ps = new PrintStream(clientSocket.getOutputStream());
clientThreads.add(this);
start();
} catch (IOException ex) {
ex.printStackTrace();
}
}

public void printMsg(String msg) {
System.out.println(msg);
}

@Override
public void run() {
while (true) {

try {
String str = dis.readLine();
if(str.equals("JavaTODO_ClientFINISH"))
{
System.out.println("JavaTODO_ClientFINISH");
clientThreads.remove(this);
this.stop();
}
else
{
System.out.println(str);
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}

/**
* sends message to all clients connected to the server
*
* @param msg to be sent
*/
public static void sendToAll(String msg) {
for (ClientHandler ch : clientThreads) {
ch.ps.println(msg);
}
}

/**
* sends message to one client
*
* @param msg to be sent to one client
*/
public void sendToOneClient(String msg,int index) {
ps.println(msg);
//clientThreads.get(index).ps.println(msg);
//psStatic.println(msg);
}

/**
* close the open connection and release resources
*/
public void closeConnection() {
try {
dis.close();
ps.close();
clientSocket.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}

最佳答案

只需添加一种 cookie 即可。 Cookie 无非是与请求一起发送的字符串。

 cookie=login_id:33384adeg73eg344;

只有当人们成功登录时,才会向他们提供 cookie ID,并且他们会在发送到服务器的每个后续请求中将其发回以对他们进行身份验证。

一个关于它如何工作的小例子。

flowchart

如果你看一下普通的 http header ,你会看到很多元数据,这些数据对于服务器了解如何处理数据、请求者期望/接受什么数据、使用什么语言、cookie 是什么等很有用。 .您可以考虑在套接字处理程序中编写这样一个简单的东西,以便能够翻译客户端“想要的”内容

accept: application/json, text/javascript, */*; q=0.01
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9
cache-control: no-cache
content-length: 489
content-type: application/x-www-form-urlencoded; charset=UTF-8
cookie: id=foobar
origin: https://stackoverflow.com

但我建议您也研究一下安全性。这些传输都很容易被网络嗅探器等拦截,并且可以被欺骗。理想情况下,您应该使用支持安全连接的安全网络传输库,至少 SSLServerSocket如果您坚持编写自己的实现。

关于java - 有没有一种方法可以仅在Java套接字中从服务器向一个客户端发送消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59986150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com