如何从服务器向所选客户端发送数据?

时间:2016-01-24 05:08:36

标签: java multithreading sockets

我正在使用java中的套接字和线程构建一个多线程示例。服务器将同时获得多个Socket,当我从服务器发送消息时,我希望客户端的套接字返回以便我给出的内容。 我到目前为止的理解是制作ArrayList,但我不知道如何将它用于我的目的。 任何人都可以帮助或给我任何解决这个问题的线索吗?

以下是代码:

//在接受客户端之前要等待的服务器套接字。

public class ServerSocketEntry {
   ServerSocket ssoc;
   Socket soc;
   ArrayList<Socket> arrSocket = new ArrayList<Socket>();
   private static final int port=4853;

public ServerSocketEntry(ServerManagement sm){
    try {
        ssoc = new ServerSocket(port);
        System.out.println("Waiting");
        while(true){
            soc=ssoc.accept();
            arrSocket.add(soc);
            System.out.println("Accepted: "+soc);
            ServerSocketThread sth = new ServerSocketThread(soc,sm);
            sth.start();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) {
    ServerManagement sm = new ServerManagement();
    new ServerSocketEntry(sm);
}

}

// threadClass使用readObject(),writeObject()方法。

public class ServerSocketThread extends Thread {
Socket soc;
ObjectOutputStream oos;
ObjectInputStream ois;
ServerManagement sm;
Food food;

public ServerSocketThread(Socket soc,ServerManagement sm) {
    this.soc=soc;
    this.sm=sm;
    try {
        ois= new ObjectInputStream(soc.getInputStream());
        oos= new ObjectOutputStream(soc.getOutputStream());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void run(){
    Command com;
    while(true){
        try {
            com = (Command) ois.readObject();
            if(com.getCommand()==Command.Member_Check){
                Member member = (Member) com.getObj();
                System.out.println("thread: "+member);
                if(sm.checkMember(member)){
                    com.setCommand(Command.Command_OK);
                }else{
                    com.setCommand(Command.Command_Fail);
                }
            }else if(com.getCommand()==Command.LogIn_Check){
                Member member = (Member) com.getObj();
                if(sm.checkLogIn(member)){
                    com.setCommand(Command.Command_OK);
                }else{
                    com.setCommand(Command.Command_Fail);
                }
            }else if(com.getCommand()==Command.Food_Check){
                ArrayList<Food> serverArrFood = com.getFoodOrder();
                if(sm.checkFood(serverArrFood)){
                    com.setCommand(Command.Command_OK);
                }else{
                    com.setCommand(Command.Command_Fail);
                }
            }
            oos.writeObject(com);
            oos.flush();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

}

1 个答案:

答案 0 :(得分:0)

然后,您可以使用哈希映射来存储连接的客户端,从地图中获取特定客户端并向其发送消息将很容易。使用客户端的昵称作为密钥和套接字作为新客户端连接到服务器时的值。将这些值放入地图中。例如:

Map<String, Socket> clients = new HashMap();
clients.put(nickname, clientSocket);

虽然写作只是通过密钥获得特定客户端。

clients.get(nickname);

并写入其输出流。当一个客户端向特定客户端发送消息时,它应该将接收者的昵称作为消息的一部分发送给服务器。