Java - TCP / IP - 服务器无法将消息发送回客户端?

时间:2017-09-18 09:09:37

标签: java tcp

我想从我的客户端向我的localhost服务器发送一个对象以添加到数据库,并发回结果是否成功发送了对象。该对象已成功发送,但我的服务器未将结果发送回客户端,并导致我的客户端帧格式因等待服务器响应而被挂起。我不知道我的代码有什么问题。你能告诉我一些方法来解决这个问题吗?

以下是发送结果的函数:

public void sendResult(String result) {
    try {
        Socket clientSocket = myServer.accept();
        System.out.println("Connected to client");
        ObjectOutputStream os = new ObjectOutputStream(clientSocket.getOutputStream());

        os.writeObject(result);
        System.out.println("Result sent");
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

调用发送结果函数的地方:

public void service() {
    try {
        if (receiveStudent() != null) {
            Student std = receiveStudent();
            if (dao.addStudent(std)) {
                System.out.println("OK");
                sendResult("OK");
            } else {
                System.out.println("FAILED");
                sendResult("FAILED");
            }
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

此外,在服务功能中,控制台打印了" OK",这意味着if条件得到满足。

接受学生方法:

public Student receiveStudent() {
    Student s = new Student();

    try {
        Socket clientSocket = myServer.accept();
        System.out.println("Connect to client successfully");
        ObjectInputStream ois = new ObjectInputStream(clientSocket.getInputStream());

        Object o = ois.readObject();
        if (o instanceof Student) {
            s = (Student) o;
            return s;
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return null;
}

3 个答案:

答案 0 :(得分:2)

由于myServer.accept()中的sendResult(),服务器再次等待传入的客户端连接,而receiveStudent()中已经发生这种情况。重用该连接。

分享您在receiveStudent()中获得的客户端套接字,例如,将其转换为字段。

public Student receiveStudent() {
    ...

    try {
        clientSocket = myServer.accept();
        ...
    } catch (Exception ex) {
        ...
    }
    ...
}

然后在sendResult()中重用该套接字以将结果发送给客户端。

public static void sendResult(String result) {
    try {
        ...
        ObjectOutputStream os = new ObjectOutputStream(clientSocket.getOutputStream());
        ...
    } catch (Exception ex) {
        ...
    }
}

答案 1 :(得分:1)

如果你想发送一个String作为对象,为什么不要使用这样的东西:

PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); //for sending String messages
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); //for getting String messages

...然后当你需要发送时,你会这样做:

out.println(textToServer");  // send to server - don't forget LN in println.
out.flush(); // to clean buffer

它应该做你需要做的事情。
并确保您的客户端等待获得InputStream您发送的内容,不要忘记这一点,因为它可能是客户端的问题。
也许客户不接受传入的Socket,无论它是ObjectInputStream还是BufferedReader都会接受传入的套接字对象。

您可以向我们提供一个客户端类,以便我们可以查看是否缺少对传入套接字的接受。

在方法结束时,请确保关闭流和套接字。

out.close();
in.close();
socket.close();

有关详情,请查看thisthisthis。我希望我能提供帮助:)

答案 2 :(得分:1)

您正在拨打accept()两次。这毫无意义。你需要:

  1. 接受连接。这将返回Socket
  2. 阅读请求并创建回复。
  3. 通过您在(1)接受的Socket发送回复。
  4. 想要为每个接受的套接字创建一个新线程,并且您还希望在该线程中执行所有I / O,包括创建{{1} }和ObjectInputStream。否则您的服务器没有正确的多线程和多客户端。