栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

向所有客户端发送消息(客户端-服务器通信)

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

向所有客户端发送消息(客户端-服务器通信)

对于成熟的服务器,不建议使用以下答案,因此您应该将Java EE与servlet,Web服务等配合使用。

仅在少数几台计算机希望连接以执行特定任务的情况下才使用此方法,并且使用简单的Java套接字不是普遍问题。想想分布式计算或多人游戏。

编辑:
自从第一篇博文以来,我已经大大更新了此架构,现在已经过测试并且是线程安全的。任何需要它的人都可以在这里下载它。

只需使用(直接或通过子类化)

Server
Client
start()
它们便已准备就绪。阅读内联注释以获得更强大的选项。


尽管客户端之间的通信非常复杂,但我将尽可能简化它。

这是服务器中的要点:

  • 保留已连接客户端的列表。
  • 定义一个线程,用于服务器输入。
  • 定义接收消息的队列。
  • 从队列中轮询线程,并对其进行处理。
  • 用于发送消息的一些实用方法。

对于客户:

  • 定义一个线程,供客户输入。
  • 定义接收消息的队列。
  • 从队列中轮询线程,并对其进行处理。

这是Server类:

public class Server {    private ArrayList<ConnectionToClient> clientList;    private linkedBlockingQueue<Object> messages;    private ServerSocket serverSocket;    public Server(int port) {        clientList = new ArrayList<ConnectionToClient>();        messages = new linkedBlockingQueue<Object>();        serverSocket = new ServerSocket(port);        Thread accept = new Thread() { public void run(){     while(true){         try{  Socket s = serverSocket.accept();  clientList.add(new ConnectionToClient(s));         }         catch(IOException e){ e.printStackTrace(); }     } }        };        accept.setDaemon(true);        accept.start();        Thread messageHandling = new Thread() { public void run(){     while(true){         try{  Object message = messages.take();  // Do some handling here...  System.out.println("Message Received: " + message);         }         catch(InterruptedException e){ }     } }        };        messageHandling.setDaemon(true);        messageHandling.start();    }    private class ConnectionToClient {        ObjectInputStream in;        ObjectOutputStream out;        Socket socket;        ConnectionToClient(Socket socket) throws IOException { this.socket = socket; in = new ObjectInputStream(socket.getInputStream()); out = new ObjectOutputStream(socket.getOutputStream()); Thread read = new Thread(){     public void run(){         while(true){  try{      Object obj = in.readObject();      messages.put(obj);  }  catch(IOException e){ e.printStackTrace(); }         }     } }; read.setDaemon(true); // terminate when main ends read.start();        }        public void write(Object obj) { try{     out.writeObject(obj); } catch(IOException e){ e.printStackTrace(); }        }    }    public void sendToOne(int index, Object message)throws IndexOutOfBoundsException {        clientList.get(index).write(message);    }    public void sendToAll(Object message){        for(ConnectionToClient client : clientList) client.write(message);    }}

这里是Client类:

public class Client {    private ConnectionToServer server;    private linkedBlockingQueue<Object> messages;    private Socket socket;    public Client(String IPAddress, int port) throws IOException{        socket = new Socket(IPAddress, port);        messages = new linkedBlokingQueue<Object>();        server = new ConnecionToServer(socket);        Thread messageHandling = new Thread() { public void run(){     while(true){         try{  Object message = messages.take();  // Do some handling here...  System.out.println("Message Received: " + message);         }         catch(InterruptedException e){ }     } }        };        messageHandling.setDaemon(true);        messageHandling.start();    }    private class ConnectionToServer {        ObjectInputStream in;        ObjectOutputStream out;        Socket socket;        ConnectionToServer(Socket socket) throws IOException { this.socket = socket; in = new ObjectInputStream(socket.getInputStream()); out = new ObjectOutputStream(socket.getOutputStream()); Thread read = new Thread(){     public void run(){         while(true){  try{      Object obj = in.readObject();      messages.put(obj);  }  catch(IOException e){ e.printStackTrace(); }         }     } }; read.setDaemon(true); read.start();        }        private void write(Object obj) { try{     out.writeObject(obj); } catch(IOException e){ e.printStackTrace(); }        }    }    public void send(Object obj) {        server.write(obj);    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/485993.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号