首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过socket java向多个客户端广播对象

通过socket java向多个客户端广播对象
EN

Stack Overflow用户
提问于 2016-11-28 12:18:43
回答 1查看 1.3K关注 0票数 1

我需要创建一个应用程序,客户端可以向服务器发送消息(以对象的形式),然后服务器将消息广播到其他客户端。

对于从服务器接收消息的客户端来说,ObjectInputStream.readobject()遇到了一些问题。在客户端侦听服务器的线程中,打印“等待读取对象”将在无限循环中打印出来,但"read object“和”print“从未显示过。为什么会这样呢?

客户端的线程侦听服务器

代码语言:javascript
复制
while (!terminate){

        try {
            System.out.println("Waiting to read object");
            ChatMessage msg = (ChatMessage) is.readObject();

            System.out.println("Read object");
            System.out.println(msg.toString());
            System.out.println("Printed");

        } catch (IOException e) {
            e.getMessage();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

写入服务器客户端

代码语言:javascript
复制
while(!terminate){

        String message = scanner.nextLine();

        if(message.equals("logout")){
            terminateProgram();
            return;
        }

        ChatMessage msg = new ChatMessage(name,message);

        try {
            os.writeObject(msg);
            os.flush();
        } catch (IOException e) {
            System.err.println("Sending message to server failed: " + e.getMessage());
        }
    }

从客户端读取消息并广播它们(服务器端)

代码语言:javascript
复制
while (!terminate) {

        try {
            Object obj = is.readObject();

            if (obj instanceof ChatMessage) {

                ArrayList<Socket> sockets = SingletonModel.getInstance().getSockets();

                for (Socket socketOne : sockets) {
                    if (socket != socketOne) {
                        System.out.println("We here");
                        os = new ObjectOutputStream(socketOne.getOutputStream());
                        os.writeObject(obj);
                        os.flush();
                        System.out.println("We done");
                    }

                }
EN

回答 1

Stack Overflow用户

发布于 2016-11-28 13:49:11

我试图在您的代码中找到这个ObjectInputStream.readobject(),您提到了它,但是没有显示它。

在服务器端,以这种方式发送对象(注意不要忘记序列化对象):

代码语言:javascript
复制
class Message implements Serializable{
  public String getMessage(){
   return "message";
}
}
代码语言:javascript
复制
ServerSocket serverSocket = new ServerSocket(3451);
  Socket server = serverSocket.accept();
  ObjectOutputStream outs = new ObjectOutputStream(server.getOutputStream());
            outs.writeObject(new Message());

在客户端,您应该以这种方式检索对象。

代码语言:javascript
复制
  // or, Socket client = new Socket(InetAddress.getLocalHost(), 3451);
 Socket client = new Socket("localhost", 3451);
 InputStream inFromServer = client.getInputStream();
   ObjectInputStream ins = new ObjectInputStream(inFromServer);
          try {
              Message message= (Message ) ins.readObject();
          } catch (ClassNotFoundException ex) { }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40844153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档