【问题标题】:Server not receiving input from client服务器没有收到客户端的输入
【发布时间】:2016-01-10 06:30:04
【问题描述】:

我有一个服务器客户端。我的问题是当客户端写消息时,服务器没有收到消息。 服务器代码

public class BankServer {

    private int port;

    private BufferedReader reader = null; 
    private PrintWriter writer = null;

    public BankServer(int port)
    {
        this.port = port;
    }

    public void startServer() {
        print("Contact server at: " + getServerAddress() + ": port: " + port);

        while(true) {
            try {
                ServerSocket ss = new ServerSocket(port);
                Socket client = ss.accept();

                if(client != null) {
                    print("Client connected");
                }

                reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
                writer = new PrintWriter(client.getOutputStream(), true);

                String msg = null;

                print("Server waiting for input");

                while((msg = reader.readLine()) != null) {
                    print("Printer: " + msg);
                    writer.write(msg);
                }

                client.close();
                ss.close();
                closeStreams();

            } catch (IOException e) {           
                e.printStackTrace();
            }
        }
    }

    private void closeStreams() {
        if(reader != null) { 
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            } }

        if(writer != null) {
            writer.close();
        }       
    }

    private String getServerAddress() {

        InetAddress inetAdr = null;

        try {
            inetAdr = InetAddress.getLocalHost();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }

        String host = inetAdr.getHostAddress();

        return host;
    }

    public void print(String msg) {
        System.out.println(msg);
    }

    public static void main(String[] args) {        
        new BankServer(2222).startServer();
    }

}

我有这段代码,服务器等待输入:

ServerSocket ss = new ServerSocket(port);
        Socket client = ss.accept();

        if(client != null) {
            print("Client connected");
}

从这段代码中,我可以看到建立了一个连接。但是当客户端发送消息时,它们不会被服务器打印出来

这是客户端代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class BankClient {

    private PrintWriter writer = null;
    private BufferedReader reader = null;
    private Socket socket;

    private int port;
    private String adr;

    public BankClient(String address, int port) 
    {
        adr = address;
        this.port = port;

        try {
            socket = new Socket(adr, this.port);
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            writer = new PrintWriter(socket.getOutputStream());


        } catch (IOException e) {
            e.printStackTrace();            
        }
    }

    public void writeMsg(String msg) {

        try {
            while((msg = reader.readLine()) != null) {
                writer.print("From client: " + msg);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {

        BankClient client = new BankClient("127.0.0.1", 2222);
        Scanner scanner = new Scanner(System.in);

        System.out.println("Waiting for input");

        while(true) {
            String msg = scanner.nextLine();
            client.writeMsg(msg);

            if(msg.equals("quit")) { 
                System.out.println("Bye");
                break; 
            }                       
        }

        scanner.close();
    }
}

这是我第一次使用流,而且我对编程也很陌生。我在 stackoverflowgoogle 上找到了很多帮助,但我就是想不通。 感谢您提供的任何帮助

【问题讨论】:

    标签: java java-io


    【解决方案1】:

    改变 writer.print("From client: " + msg);writer.println("From client: " + msg); 并在客户端删除while((msg = reader.readLine()) != null)

    编辑:你必须添加writer.flush();。这对我有用。

    EDIT2:完整的解决方案。在此处更改BankClient

    public void writeMsg(String msg) { writer.println("From client: " + msg); writer.flush(); }

    【讨论】:

    • 这没有帮助。但是感谢您提供的信息,我不知道writer.print(...) 这会导致服务器收不到任何东西。对上述评论投反对票的人能否解释一下原因?
    • 我忽略了PrintWriter。 API 文档说“创建一个新的 PrintWriter,而不自动刷新行”。因此,如果没有显式刷新,则不会向服务器发送任何内容。客户端上的附加 while((msg = reader.readLine()) != null) 似乎是复制和粘贴错误,因为在服务器收到某些内容之前,您不会从服务器发送任何内容。
    【解决方案2】:

    替换:

    public void writeMsg(String msg) {
    
            try {
                while((msg = reader.readLine()) != null) {
                    writer.print("From client: " + msg);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    

    作者:

    public void writeMsg(String msg) {
            try {
                DataOutputStream outToServer = new DataOutputStream(socket.getOutputStream());
                outToServer.writeBytes("From client: " + msg + "\n");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    

    客户端:

    服务器端:

    【讨论】:

    • 不幸的是,这似乎没有帮助。结果保持不变
    • 运行 BankServer 然后运行 ​​BankClient 并输入服务器将打印的任何内容,它对我有用,我确定请检查
    • 您必须添加writer.flush();。这对我有用。
    • 这太奇怪了。它对我不起作用。我在 Eclipse 中运行服务器,在终端中运行客户端。你是如何运行它的?
    • 两者都在工作!您还可以使用自动刷新创建PrintWriter。必不可少的部分是与您的服务器代码匹配的换行符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 2012-01-22
    • 2017-12-29
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多