Java 如何向现有客户端之一发送消息?
我正在和一个大学项目做一个聊天节目。我这样做是为了让它发挥作用。 现在是实现登录的时候了,但我担心安全问题,因为我现在创建的结构将消息发送给我们所有的客户端Java 如何向现有客户端之一发送消息?,java,multithreading,Java,Multithreading,我正在和一个大学项目做一个聊天节目。我这样做是为了让它发挥作用。 现在是实现登录的时候了,但我担心安全问题,因为我现在创建的结构将消息发送给我们所有的客户端 如何将消息发送到所有客户端线程,但如何将消息发送到当前正在发送消息的客户端 我将像这样向服务器发送消息 LOGIN#ID#PASSWORD#TIMESTAMP TEXTSEND#TEXT FUNCTION#FUNCTION_CHILD#FUNCTION_CHILD2#.... 这是我的密码 服务器代码 import java.net.In
如何将消息发送到所有客户端线程,但如何将消息发送到当前正在发送消息的客户端 我将像这样向服务器发送消息
LOGIN#ID#PASSWORD#TIMESTAMP
TEXTSEND#TEXT
FUNCTION#FUNCTION_CHILD#FUNCTION_CHILD2#....
这是我的密码
服务器代码
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Vector;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
final public String SELP_IP="127.0.0.1"; // Testing for My Computer IP
public static ExecutorService threadPool;
public static Vector<Client> clients = new Vector<Client>();
ServerSocket serverSocket;
//Run server and wait connection
public void startServer(String IP, int port){
try{
serverSocket =new ServerSocket();
serverSocket.bind(new InetSocketAddress(IP,port));
System.out.println("server started!");
}catch (Exception e){
e.printStackTrace();
if (serverSocket.isClosed()){
stopServer();
}
return;
}
// new thread for waiting client connection
Runnable thread = new Runnable() {
@Override
public void run() {
while (true){
try {
Socket socket=serverSocket.accept();
clients.add(new Client(socket));
System.out.println("[Client Connection]");
System.out.println(socket.getRemoteSocketAddress()+":"+Thread.currentThread().getName());
}catch (Exception e){
if(!serverSocket.isClosed()){
stopServer();
}
break;
}
}
}
};
threadPool= Executors.newCachedThreadPool();
threadPool.submit(thread);
}
//this is for Stopping Server
public void stopServer(){
try{
//Close All exsiting Socket
Iterator<Client> iterator = clients.iterator();
while (iterator.hasNext()){
Client client=iterator.next();
client.socket.close();
iterator.remove();
}
//Close Server Object
if(serverSocket!=null&&!serverSocket.isClosed()){
serverSocket.close();
}
//Kill threadPool
if (threadPool!=null&&!threadPool.isShutdown()){
System.out.println("EXIT COMPLETE!");//DEBUG!!!!!!!!!!!!!!!!!
threadPool.shutdown();
}
}catch (Exception e){
e.printStackTrace();
}
}
//UIrun
public void start(){
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
Main m=new Main();
m.startServer(m.SELP_IP,3306);
if(in.next().equals("stop")){
m.stopServer();
}
}
}
如何将消息发送到所有客户端线程,但如何将消息发送到当前正在发送消息的客户端
这句话让人困惑,但我猜你是在问如何只向特定客户发送消息。
通常,在具有用户/登录名的系统中,每个用户/登录名都有一个唯一的密钥。假设您的示例中是loginId,对于您的代码示例,您是否可以检查这是否是循环中发送给当前客户机的消息,如:
for(Client client : Main.clients){
if (client.apply(message) {
client.send(message);
}
}
在应用(消息)中,您可以检查这是否是给我的消息
您当前的设计意味着,对于一条消息,您必须循环所有客户机,这对于学校项目来说应该可以,但您可以考虑订户模式或广播之类的内容。这些设计应该更符合您的要求。
另外,您可以使用一些消息队列,这也是一个很好的方法。对不起,我的英语很差。是的,我只想把信息发送给特定的客户。但应用方法在哪里呢?我找不到它的文档。我的意思是你应该自己添加一个像“应用(消息)”这样的函数。在它里面,检查这个消息是否应该发送给这个客户机,您可以通过匹配id或任何其他逻辑进行检查。
for(Client client : Main.clients){
if (client.apply(message) {
client.send(message);
}
}