Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.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/6/multithreading/4.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/2/node.js/37.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_Multithreading - Fatal编程技术网

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);
   }
}