【问题标题】:Why is third printstream println() command skipped? [closed]为什么跳过第三个 printstream println() 命令? [关闭]
【发布时间】:2018-01-10 23:17:14
【问题描述】:

我正在编写一个服务器/客户端程序,其中服务器向客户端发送消息,反之亦然。它完美地工作,除了printRemoteAddress() 方法中的out.println 语句。 "HELLO1""HELLO2" 打印到客户端,但 "HELLO3" 没有。

我的问题是,为什么"HELLO3" 不打印到客户端,但前两个打印?

服务器代码:

class Worker extends Thread {

Socket sock;
Worker (Socket s) {sock = s;}


    public void run() {

        PrintStream out = null;
        BufferedReader in = null;
        try {
            in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
            out = new PrintStream(sock.getOutputStream());

            try {
                String name;
                name = in.readLine();
                System.out.println("Looking up " + name);
                printRemoteAddress(name, out);
            } catch (IOException x) {
                System.out.println("Server read error");
                x.printStackTrace();
            }
            sock.close();
        } catch (IOException ioe) {System.out.println(ioe);}
    }

        static void printRemoteAddress (String name, PrintStream out) {
            try {
                out.println("HELLO1");
                out.println("HELLO2");
                out.println("HELLO3");
                InetAddress machine = InetAddress.getByName(name);
            } catch(UnknownHostException ex) {          
                out.println ("Failed in attempt to look up " + name);
            }
        }




public class InetServer {

public static void main(String a[]) throws IOException {
    int q_len = 6;
    int port = 2000;
    Socket sock;

    ServerSocket servsock = new ServerSocket(port, q_len);

    System.out.println
        ("Inet server 1.8 starting up, listening at port 2000.\n");
    while (true) {
        sock = servsock.accept();
        new Worker(sock).start();
    }   
}

客户代码:

public class InetClient {

public static void main (String args[]) {
    String serverName;
    if (args.length < 1) serverName = "localhost";
    else serverName = args[0];

    System.out.println("Inet Client, 1.0.\n");
    System.out.println("Using server: " + serverName + ", Port: 2000");

    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    try {
        String name;
        do {
            System.out.print("Enter hostname of IP address: ");
            System.out.flush();
            name = in.readLine();
            if (name.indexOf("stop") < 0)
                getRemoteAddress(name, serverName);
        } while (name.indexOf("stop") < 0);
        System.out.println("Process stopped.");;
    } catch (IOException x) {x.printStackTrace();}
}

static void getRemoteAddress (String name, String serverName) {
    Socket sock;
    BufferedReader fromServer;
    PrintStream toServer;
    String textFromServer;

    try {
        sock = new Socket(serverName, 2000);

        fromServer = new BufferedReader (new InputStreamReader(sock.getInputStream()));

        toServer = new PrintStream(sock.getOutputStream());
        toServer.println(name);
        toServer.flush();

        for (int i = 1; i <3; i++) {
            textFromServer = fromServer.readLine();
            if (textFromServer != null) System.out.println(textFromServer);
        }
        sock.close();
    } catch (IOException x) {
        System.out.println("Socket error.");
        x.printStackTrace();    
    }   
}

}

【问题讨论】:

  • 你需要先检查readLine()的结果是否为null,然后再对它进行任何操作,如果你得到它,请关闭套接字。
  • 在您的客户端代码中:for (int i = 1; i &lt;3; i++) { 仅迭代 2 次。写在纸上看看。要么从零开始,要么使用
  • 谢谢。我将其更改为

标签: java printstream


【解决方案1】:
 for (int i = 1; i <3; i++) {

Bzzzzzzzzt。这会迭代两次,而不是三次。应该是

 for (int i = 1; i <= 3; i++) {

事实上,根本不硬连线 3 会更有意义:

while ((textFromServer = fromServer.readLine()) != null {
    System.out.println(textFromServer);
}

println() 没有被“跳过”,但PrintStream 被缓冲并且不会自动刷新换行符。您可以使用第二个参数来构造它,或者根据需要调用flush(),或者使用PrintWriter

您还应该关闭PrintStream/PrintWriter,而不是Socket

【讨论】:

  • 即使我使用 autoflosh (out = new PrintStream(sock.getOutputStream(), true);) 构建它仍然无法正常工作。也不会在每个 out.println() 语句之间放置 out.flush() 命令。
  • 那你的客户端代码肯定有问题,你没有贴出来。将其编辑到您的问题中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-12
  • 2016-07-27
相关资源
最近更新 更多