为什么跳过第三个打印流 println() 命令?

奥马尔

我有一个正在编写的服务器/客户端程序,其中服务器向客户端发送消息,反之亦然。它工作得很好,除了方法中的out.println语句printRemoteAddress()"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();    
    }   
}

}

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

嗡嗡声。这迭代了两次,而不是三次。它应该是

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

事实上,完全不将 3 硬连线会更有意义:

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

println()不是“跳过”,而是PrintStream被缓冲,并不会在新行自动冲洗。您可以使用第二个参数来构造它,或者flush()根据需要调用,或者使用PrintWriter.

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么此sed命令不能替换倒数第三个“ and”?

来自分类Dev

ss命令输出说明(进程描述中的第三个数字)

来自分类Dev

是什么决定System.out.println(args)命令的打印位置?

来自分类Dev

同时运行两个命令并通过管道传输到第三个命令

来自分类Dev

Bash(单行):如果第一个成功,则执行第二个命令;如果不成功,则执行第三个命令?

来自分类Dev

为什么println()打印此内容?

来自分类Dev

管道的三个命令

来自分类Dev

如何从第三个字段打印CSV

来自分类Dev

为什么println只打印布尔值

来自分类Dev

为什么这第三个div影响其他两个div?

来自分类Dev

为什么System.out.println不好?

来自分类Dev

为什么println不显示我的数组

来自分类Dev

为什么GUID中的第三个数据以4开头?

来自分类Dev

为什么ioctl调用的原型使用unsigned long作为第三个参数?

来自分类Dev

为什么我的第三个条件在搜索中不起作用?

来自分类Dev

为什么在添加第三个对象时array.reduce返回NaN

来自分类Dev

为什么ioctl调用的原型使用unsigned long作为第三个参数?

来自分类Dev

为什么在getopts bash中不解析第三个参数

来自分类Dev

Ruby:为什么第三个条件语句不为真?

来自分类Dev

为什么 getLoaderManager.initLoader() 第三个参数 = 这是无效的?

来自分类Dev

为什么 println(measure + '"'); 和 println(measure + '\"'); 添加到测量,同时使用单独的语句打印正确吗?

来自分类Dev

使用println()打印`po`对象描述?

来自分类Dev

Java:双重打印-println或printf

来自分类Dev

System.out.println同时打印

来自分类Dev

Java 使用 println 方法打印继承的对象

来自分类Dev

Println 打印多次而不是每次循环增加

来自分类Dev

在OS X中,为什么使用println()导致我的程序比没有println()的程序运行更快

来自分类Dev

替换第三个值

来自分类Dev

为什么两个程序有前向引用错误而第三个程序没有?

Related 相关文章

  1. 1

    为什么此sed命令不能替换倒数第三个“ and”?

  2. 2

    ss命令输出说明(进程描述中的第三个数字)

  3. 3

    是什么决定System.out.println(args)命令的打印位置?

  4. 4

    同时运行两个命令并通过管道传输到第三个命令

  5. 5

    Bash(单行):如果第一个成功,则执行第二个命令;如果不成功,则执行第三个命令?

  6. 6

    为什么println()打印此内容?

  7. 7

    管道的三个命令

  8. 8

    如何从第三个字段打印CSV

  9. 9

    为什么println只打印布尔值

  10. 10

    为什么这第三个div影响其他两个div?

  11. 11

    为什么System.out.println不好?

  12. 12

    为什么println不显示我的数组

  13. 13

    为什么GUID中的第三个数据以4开头?

  14. 14

    为什么ioctl调用的原型使用unsigned long作为第三个参数?

  15. 15

    为什么我的第三个条件在搜索中不起作用?

  16. 16

    为什么在添加第三个对象时array.reduce返回NaN

  17. 17

    为什么ioctl调用的原型使用unsigned long作为第三个参数?

  18. 18

    为什么在getopts bash中不解析第三个参数

  19. 19

    Ruby:为什么第三个条件语句不为真?

  20. 20

    为什么 getLoaderManager.initLoader() 第三个参数 = 这是无效的?

  21. 21

    为什么 println(measure + '"'); 和 println(measure + '\"'); 添加到测量,同时使用单独的语句打印正确吗?

  22. 22

    使用println()打印`po`对象描述?

  23. 23

    Java:双重打印-println或printf

  24. 24

    System.out.println同时打印

  25. 25

    Java 使用 println 方法打印继承的对象

  26. 26

    Println 打印多次而不是每次循环增加

  27. 27

    在OS X中,为什么使用println()导致我的程序比没有println()的程序运行更快

  28. 28

    替换第三个值

  29. 29

    为什么两个程序有前向引用错误而第三个程序没有?

热门标签

归档