我怎样才能得到java中服务器TCP的回复

aU *_*sUd 1 java tcp bufferedwriter

我的代码只是执行一个简单的任务,将文本从客户端控制台发送到服务器并接收回复。但我的代码不起作用。我不断向服务器发送文本,但没有回复。我做了几个例子,加上客户给的 2 个数字。我以同样的方式执行此操作,但我无法弄清楚问题是什么。

服务器:

public class Server {
    public static void main(String[] args) {
        try {
            ServerSocket server = new ServerSocket(8);
            Socket client = server.accept();
            BufferedReader inFromClient = new BufferedReader(new InputStreamReader(client.getInputStream()));
            BufferedWriter outToClient = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
            String in = inFromClient.readLine(),out;
            while(in!=null){
                out = in+" from server";
                outToClient.write(out);
                outToClient.newLine();
                outToClient.flush();
            }
            inFromClient.close();
            outToClient.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

客户:

public class Client {
    public static void main(String[] args) {
        try {
            Socket client = new Socket("localhost", 8);
            System.out.println("Connected to server");
            BufferedReader inFromServer = new BufferedReader(new InputStreamReader(client.getInputStream()));
            BufferedWriter outToServer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
            Scanner input = new Scanner(System.in);
            String strClient,strServer;
            while(true){
                System.out.print("Client: ");
                strClient = input.nextLine();
                outToServer.write(strClient);
                strServer = inFromServer.readLine();
                System.out.print("Server: ");
                System.out.println(strServer);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

Par*_*alo 5

您的代码存在几个问题:

  1. 您的服务器期望读取一行,而您只编写没有换行符的文本:

使用以下命令读取服务器中的一行:inFromClient.readLine()

在客户端中写入不带换行符的文本:outToServer.write(strClient); 将其更改为outToServer.write(strClient + "\n");


  1. 你不会冲掉客户的作者。outToServer.flush();在该行后面添加一个outToServer.write(...);

  1. 您只读取服务器中的 1 行,并且不会再次读取循环内的内容。

编辑:为了使它更容易,我将在此处发布更正后的代码:(我已经尝试过了,它的工作原理就像一个魅力)

客户:

public class Client {
    public static void main(String[] args) {
        try (Socket client = new Socket("localhost", 8);
            BufferedReader inFromServer = new BufferedReader(new InputStreamReader(client.getInputStream()));
            BufferedWriter outToServer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
            Scanner input = new Scanner(System.in)) {

            System.out.println("Connected to server");
            String strClient,strServer;

            while(true){
                System.out.print("Client: ");
                strClient = input.nextLine();
                outToServer.write(strClient);
                outToServer.newLine();
                outToServer.flush();
                strServer = inFromServer.readLine();
                System.out.println("Server: " + strServer);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

服务器:

public class Server {
    public static void main(String[] args) {
        try (ServerSocket server = new ServerSocket(8);
            Socket client = server.accept();
            BufferedReader inFromClient = new BufferedReader(new InputStreamReader(client.getInputStream()));
            BufferedWriter outToClient = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()))) {

            String in = inFromClient.readLine(), out;
            while(in != null){
                out = in + " from server";
                outToClient.write(out);
                outToClient.newLine();
                outToClient.flush();
                in = inFromClient.readLine();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,该解决方案使用 Javas ARM(自动资源管理)来自动关闭流和套接字。所以这在java 1.7之前是行不通的!