【问题标题】:Send objects and strings over socket通过套接字发送对象和字符串
【发布时间】:2018-04-04 15:19:33
【问题描述】:

我已经尝试了几种方法来发送一个字符串然后一个对象到我的服务器并让我的服务器doSomething() 然后将一个字符串和一个对象发送回客户端但是到目前为止服务器甚至没有接收到字符串.以下是我目前的方法。

完成发送/接收的服务器代码部分:

try
        {

            ObjectInputStream fromClientObject = new ObjectInputStream(socket.getInputStream());
            ObjectOutputStream toClientObject = new ObjectOutputStream(socket.getOutputStream());

            while(!socket.isClosed())
            {
                //If server has received a message
                if(fromClientObject.available() > 0)
                {
                    //Set received message to string and print
                    String input = fromClientObject.readUTF();
                    System.out.println(input);

                    //If clients sets .register command then register new user
                    if (input.equals(".register"))
                    {
                        Object obj = fromClientObject.readObject();
                        Users user = (Users) obj;
                        server.registerUsers(user);
                    }

                    //If clients sends .findUser command then see if user exists in DB
                    if (input.equals(".findUser"))
                    {
                        //Read object from client
                        Object obj = fromClientObject.readObject();
                        Users user = (Users) obj;

                        //Create a pair and find the user
                        Pair<Boolean,Users> findUsers;
                        findUsers = server.findUsers(user); //This checks if the user exists and returns true or false

                        if(findUsers.getFirst())
                        {
                            toClientObject.writeUTF("True");
                            toClientObject.flush();

                            toClientObject.writeObject(findUsers.getSecond()); //Send the found user object to the client
                            toClientObject.flush();
                        }
                        else
                        {
                            toClientObject.writeUTF("false");
                            toClientObject.flush();
                        }
                    }
                }
            }
        }
        catch (IOException | ClassNotFoundException e)
        {
            e.printStackTrace();
        }

我也尝试过使用Scanner 接收字符串和单独的ObjectInputStream 接收对象,但无济于事。

下面是客户端如何接收服务器发送的字符串和对象以及如何向服务器发送信息

try(Socket socket = new Socket(host, portNumber);
    ObjectInputStream fromServerObject = new ObjectInputStream(socket.getInputStream());
    ObjectOutputStream toServerObject  = new ObjectOutputStream(socket.getOutputStream()))
    {
        Thread.sleep(1000);

        //Setup I/O
        toServerObject.writeUTF(code); //This is the string
        toServerObject.flush();

        toServerObject.writeObject(user); //This is a serialised object
        toServerObject.flush();


        if (code.equals(".findUser"))
        {
            String input = fromServerObject.readUTF();
            Users readUser = (Users) fromServerObject.readObject();

            if (input.equals("True"))
            {
                updateMessage("True");
                updateValue(readUser);
            } else if (input.equals("false"))
            {
                updateMessage("False");
            }
        } else
        {
            updateMessage("True");
        }
    }
    catch (IOException e)
    {
        System.err.println("Fatal Connection error!");
        e.printStackTrace();
        updateMessage("Failed");
    }
    return null;

关于如何规避这个问题的任何想法?我正在考虑制作单独的函数来编写消息/接收和单独的编写和接收和对象,但我不想在没有获得我当前实现的输入的情况下尝试它。

【问题讨论】:

    标签: java java-io


    【解决方案1】:

    流的排序似乎解决了here所解释的问题

    服务器是用来接收然后发送的,所以它会是

    ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
    ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
    

    而客户端是发送然后接收 所以顺序是相反的

    【讨论】:

      猜你喜欢
      • 2012-03-13
      • 2014-02-09
      • 1970-01-01
      • 1970-01-01
      • 2019-04-21
      • 2014-01-11
      • 2022-01-15
      • 2021-01-11
      相关资源
      最近更新 更多