Java 为什么跳过第三个printstream println()命令?

Java 为什么跳过第三个printstream println()命令?,java,printstream,Java,Printstream,我正在编写一个服务器/客户机程序,其中服务器向客户机发送消息,反之亦然。除了printRemoteAddress()方法中的out.println语句之外,它工作得非常好“HELLO1”和“HELLO2”打印到客户端,但“HELLO3”不打印到客户端 我的问题是,为什么“HELLO3”不打印到客户端,而前两个打印到客户端 服务器代码: class Worker extends Thread { Socket sock; Worker (Socket s) {sock = s;} p

我正在编写一个服务器/客户机程序,其中服务器向客户机发送消息,反之亦然。除了
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();    
    }   
}
公共类客户端{
公共静态void main(字符串参数[]){
字符串serverName;
如果(args.length<1)serverName=“localhost”;
else serverName=args[0];
System.out.println(“Inet客户端,1.0.\n”);
System.out.println(“使用服务器:+serverName+”,端口:2000”);
BufferedReader in=新的BufferedReader(新的InputStreamReader(System.in));
试一试{
字符串名;
做{
System.out.print(“输入IP地址的主机名:”);
System.out.flush();
name=in.readLine();
if(name.indexOf(“stop”)<0)
getRemoteAddress(名称、服务器名称);
}while(name.indexOf(“stop”)<0);
System.out.println(“进程停止”);;
}catch(iox异常){x.printStackTrace();}
}
静态无效getRemoteAddress(字符串名称、字符串服务器名称){
插座;
来自服务器的BufferedReader;
打印流到服务器;
字符串textFromServer;
试一试{
sock=新套接字(serverName,2000);
fromServer=new BufferedReader(新的InputStreamReader(sock.getInputStream());
toServer=newprintstream(sock.getOutputStream());
toServer.println(名称);
toServer.flush();
对于(int i=1;i
println()
不是“跳过的”,而是缓冲的,不会自动刷新换行符。您可以使用第二个参数来构造它,或者根据需要调用
flush()
,或者使用
PrintWriter


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

,即使我使用autoflosh构建它(
out=new PrintStream(sock.getOutputStream(),true);
),它仍然不工作。在每个
out.println()之间插入
out.flush()
命令
语句。那么您的客户机代码一定有问题,您还没有发布。请将其编辑到您的问题中。您需要先检查
readLine()
的结果是否为null,然后再对其执行其他操作,如果您得到它,请关闭套接字。在您的客户机代码中:
for(int i=1;谢谢。我将其更改为
 for (int i = 1; i <3; i++) {
 for (int i = 1; i <= 3; i++) {
while ((textFromServer = fromServer.readLine()) != null {
    System.out.println(textFromServer);
}