简体   繁体   English

我如何从Java中的服务器TCP获得答复

[英]How can i get the reply from server TCP in java

My code just do a simple task send a text from client's console to server and receive a reply. 我的代码只是执行一个简单的任务,即从客户端控制台向服务器发送文本并接收回复。 But my code doesn't work though. 但是我的代码却无法正常工作。 I keep sending text to server and no reply sending back. 我一直在向服务器发送文本,而没有回复发回。 I have done a several example that plus 2 number given from client. 我已经做了几个例子,再加上客户提供的2个数字。 I do this the same way but i can't figure out what is the problem. 我以同样的方式这样做,但我不知道是什么问题。

Server: 服务器:

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

    }
}

Client: 客户:

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

    }
}

There are several problems with your code: 您的代码有几个问题:

  1. Your server is expecting to read a line and you're only writing text without a newline symbol: 您的服务器希望读取一行,而您只写没有换行符的文本:

Reading a line in server with: inFromClient.readLine() 使用以下命令读取服务器中的一行: inFromClient.readLine()

Writing text without newline in client: outToServer.write(strClient); 在客户端中写没有换行符的文本: outToServer.write(strClient); Change this to outToServer.write(strClient + "\\n"); 将其更改为outToServer.write(strClient + "\\n");


  1. You don't flush the writer of the client. 您不会刷新客户端的作者。 Add a outToServer.flush(); 添加一个outToServer.flush(); after the line outToServer.write(...); outToServer.write(...);行之后

  1. You only read 1 line in the server and don't read inside the loop again. 您仅在服务器中读取1行,而不再在循环内读取。

EDIT: To make it easier i'll post the corrected code here: (I've tried it and it works like a charm) 编辑:为了更容易,我将在此处发布更正的代码:(我已经尝试过了,它的工作原理就像一个咒语)

Client: 客户:

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

Server: 服务器:

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

Please remark that this solution uses Javas ARM (Automatic resource management) for autoclosing streams and sockets. 请注意,此解决方案使用Javas ARM(自动资源管理)来自动关闭流和套接字。 So this will not work before java 1.7! 因此,这在Java 1.7之前不起作用!

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

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