繁体   English   中英

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

[英]Java - TCP/IP - Server can't send message back to Client?

我想将一个对象从客户端发送到本地服务器以添加到数据库,然后将结果发送回该对象是否成功发送。 该对象已成功发送,但是我的服务器没有将结果发送回客户端,并且由于等待服务器的响应而导致我的客户端帧形式挂起。 我不知道我的代码有什么问题。 您能告诉我一些解决方法吗?

这是发送结果的功能:

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

由于sendResult()myServer.accept() ,服务器再次等待传入的客户端连接,而这已经在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) {
        ...
    }
}

如果要发送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接受传入的套接字对象。

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

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

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

有关更多详细信息,请检查 希望对您有所帮助:)

您两次调用accept() 这是没有意义的。 你需要:

  1. 接受连接。 这将返回一个Socket
  2. 阅读请求并创建响应。
  3. 通过您在(1)接受的同一Socket发送响应。

希望为每个接受的套接字创建一个新线程,并且还希望在该线程中执行所有I / O, 包括创建ObjectInputStreamObjectOutputStream 否则,您的服务器将无法正确使用多线程和多客户端。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM