簡體   English   中英

如何從服務器向選定的客戶端發送數據?

[英]how can i send data to the selected client from server?

我正在使用Java中的套接字和線程構建多線程示例。 服務器將在同一時間獲得多個套接字,並且當我從服務器發送消息時,我希望客戶端的套接字能夠返回以便提供給我。 到目前為止,我的理解是制作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);
}

}

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

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

}

然后,您可以使用哈希映射來存儲連接的客戶端,並且很容易從映射中獲取特定客戶端並將消息發送給該客戶端。 當新客戶端連接到服務器時,請使用客戶端的昵稱作為鍵,並使用套接字作為值。 將這些值放入地圖。 例如:

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

在編寫時,只需按其鍵即可獲取該特定客戶端。

clients.get(nickname);

並寫入其輸出流。 當一個客戶端向特定客戶端發送消息時,它應該將接收者的昵稱作為消息的一部分發送給服務器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM