Java:简单的客户端服务器消息交换不起作用

标签 java

我是昨天刚开始接触 Java 的新手。我写了一个非常简单的客户端服务器java代码。客户端向服务器发送消息。服务器应该显示该消息。服务器收到消息后应向客户端发送消息。客户端应该显示服务器发送的消息。

服务器代码,

import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.OutputStreamWriter;
import java.io.BufferedWriter;
import java.net.Socket;
import java.net.ServerSocket;

public class CustomServer{
    public static void main(String[] args){
       final int SERVER_PORT_NUMBER = 8081;

       try{
         ServerSocket serverObj = new ServerSocket(SERVER_PORT_NUMBER);
         Socket clientSocketObj = serverObj.accept();
         BufferedReader clientInputStream = new BufferedReader(new InputStreamReader(clientSocketObj.getInputStream()));
         BufferedWriter clientOutputStream = new BufferedWriter(new OutputStreamWriter(clientSocketObj.getOutputStream()));

        if(clientSocketObj != null){
            System.out.println("Client Connected to Server!");

            // Recieve Message from Client
            System.out.println("MESSAGE FROM CLIENT");
            System.out.println(clientInputStream.readLine());

            // Send Message to Client
            clientOutputStream.write("SERVER: Hello Client!");

            // Close Streams
            clientOutputStream.close();
            clientInputStream.close();
        }
        serverObj.close();
    }
    catch(Exception e){
        System.out.println(e);
    }
}
}

客户端,

import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;

public class CustomClient{
    public static void main(String[] args){
        final String HOST_NAME = "127.0.0.1";
        final int SERVER_PORT_NUMBER = 8081;

        try{
           Socket clientSocket = new Socket(HOST_NAME, SERVER_PORT_NUMBER);
           BufferedWriter clientOutputStream = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
           BufferedReader clientInputStream = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
           System.out.println("Connecting....");

        if(clientSocket != null){
            System.out.println("Connected to Server!");

            // Send message to Server
            clientOutputStream.write("CLIENT: HELLO SERVER");

            // Recieve message from Server
            System.out.println("MESSAGE FROM SERVER");
            System.out.println(clientInputStream.readLine());

            // Close Streams
            clientInputStream.close();
            clientOutputStream.close();
        }
        clientSocket.close();
    }
    catch(Exception e){
        System.out.println(e);
    }
}
}

服务器和客户端都没有收到消息。陷入某种循环。有谁知道为什么吗?

最佳答案

首先阅读 BufferedReader's JavaDocs ,哪个状态

Reads a line of text. A line is considered to be terminated by any one of a line feed ('\n'), a carriage return ('\r'), or a carriage return followed immediately by a linefeed

BufferedWriter#write 没有发送此消息,因此读者仍在等待。

一个简单的解决方案可能是使用 BufferedWriter#newLine 写入

之后

别忘了 flush当你完成写入缓冲区时!

您可能还想查看try-with-resources这将提供更好的资源管理解决方案

自定义客户端

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class CustomClient {

    public static void main(String[] args) {
        final String HOST_NAME = "127.0.0.1";
        final int SERVER_PORT_NUMBER = 8081;

        try (Socket clientSocket = new Socket(HOST_NAME, SERVER_PORT_NUMBER)) {
            try (BufferedWriter clientOutputStream = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
                    BufferedReader clientInputStream = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()))) {
                System.out.println("Connecting....");
                System.out.println("Connected to Server!");

                // Send message to Server
                clientOutputStream.write("CLIENT: HELLO SERVER");
                clientOutputStream.newLine();
                clientOutputStream.flush();

                // Recieve message from Server
                System.out.println("MESSAGE FROM SERVER");
                System.out.println(clientInputStream.readLine());
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

自定义服务器

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class CustomServer {

    public static void main(String[] args) {
        final int SERVER_PORT_NUMBER = 8081;

        try (ServerSocket serverObj = new ServerSocket(SERVER_PORT_NUMBER)) {
            try (Socket clientSocketObj = serverObj.accept()) {
                try (BufferedReader clientInputStream = new BufferedReader(new InputStreamReader(clientSocketObj.getInputStream()));
                        BufferedWriter clientOutputStream = new BufferedWriter(new OutputStreamWriter(clientSocketObj.getOutputStream()))) {

                    System.out.println("Client Connected to Server!");

                    // Recieve Message from Client
                    System.out.println("MESSAGE FROM CLIENT");
                    System.out.println(clientInputStream.readLine());

                    // Send Message to Client
                    clientOutputStream.write("SERVER: Hello Client!");
                    clientOutputStream.newLine();
                    clientOutputStream.flush();
                }
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

关于Java:简单的客户端服务器消息交换不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51487743/

相关文章:

java - Spring security - 更改/登录默认路径

java - 如果您的 Serializable 类包含一个不可序列化的成员,会发生什么情况?你如何解决它?

java - 如何设置单独的数据库进行测试?

java - 如何检索属性的值

java - FragmentMapActivity 中的 NoClassDefFoundError

java - 私有(private)静态 final 与私有(private) final

java - Hibernate异常: No Hibernate Session bound to thread

java - 如何保存从 http 响应发送的文件而不包含 header

java - 如何从jetty下的web-app.war中获取lib.jar的类实例?

java - 具有重复键的映射行为