为什么hasNextLine()在从控制台获取数据时阻止执行程序?

时间:2015-03-29 20:27:35

标签: java

今天我试图写一些,比方说,互联网传播者。 我正在学习Java的基础知识(来自instructables),现在是网络编程的时候了。 我希望我的程序做什么: 如果有来自网络的输入流的任何数据 - 获取数据,将其放入字符串并在控制台中打印。 如果控制台中有数据 - 将其放入字符串并通过网络发送。

当我尝试仅将数据从客户端应用程序发送到服务器并在服务器控制台中打印时 - 一切正常。但后来我有不同的代码(没有获取和发送数据两种方式)。 我知道问题在于行内部而(true)语句在行if(cin.hasNextLine())。我不明白为什么它会阻止整个app应该只是返回false或true如果控制台中没有或有数据(来自键盘)。

令人讨厌的是,它与阅读文件完美配合。

喔。而且我还试图检查我没有输入控制台的IF数据是“”。它没有解决我的问题。

服务器代码:

import java.net.*;
import java.io.*;
import java.util.*;
import java.time.LocalTime;

public class GreetingServer extends Thread {
        private ServerSocket serverSocket;

        public GreetingServer(int port) throws IOException {
                serverSocket = new ServerSocket(port, 0);
                serverSocket.setSoTimeout(30000);
        }

        public void run() {
                while(true) {
                        try {
                                System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "...");

                                Socket server = serverSocket.accept();

                                System.out.println("Just connected to " + server.getRemoteSocketAddress());
                                DataInputStream in = new DataInputStream(server.getInputStream());
                                System.out.println(in.readUTF());
                                DataOutputStream out = new DataOutputStream(server.getOutputStream());
                                out.writeUTF("Thank you for connecting to " + server.getLocalSocketAddress());
                                FileWriter plik = new FileWriter("/home/greg/Dokumenty/logizserwera.txt", true);
                                System.out.println("StartTime: " + LocalTime.now());

                                Scanner cin = new Scanner(System.in);
                                String stringReadyToSend, stringGotFromClient = null;
                                while(true) {
                                        System.out.println("Before hasnextline");
                                        if(cin.hasNextLine()) {
                                                stringReadyToSend = cin.nextLine();
                                                out.writeUTF(stringReadyToSend);
                                        }

                                        if(in.available() != 0) {
                                                stringGotFromClient = in.readUTF();
                                                // EOT means End Of Transmission
                                                if(stringGotFromClient.equals("EOT")) break;
                                                else System.out.println("Message from client: " + stringGotFromClient();
                                        }
                                        else System.out.println("No message");

                                break;
                                }

                                System.out.println("EndTime: " + LocalTime.now());
                                server.close();
                                plik.close();
                        }
                        catch(SocketTimeoutException s) {
                                System.out.println("Socket timed out!");
                                break;
                        }
                        catch(IOException e) {
                                e.printStackTrace();
                                break;
                        }
                }
        }

        public static void main(String[] args) {
                int port = 6066;
                try {
                        Thread t = new GreetingServer(port);
                        t.start();
                }catch(IOException e) {
                        e.printStackTrace();
                }
        }
}

客户代码:

import java.net.*;
import java.io.*;
import java.util.*;

public class GreetingClient {
        public static void main(String[] args) {
                String serverName = "localhost";
                Scanner cin = new Scanner(System.in);
                int port = 6066;
                try {
                        System.out.println("Connecting to " + serverName + " on port " + port);
                        Socket client = new Socket(serverName, port);
                        System.out.println("Just connected to " + client.getRemoteSocketAddress());
                        OutputStream outToServer = client.getOutputStream();
                        DataOutputStream out = new DataOutputStream(outToServer);
                        out.writeUTF("Hello from " + client.getLocalSocketAddress());
                        InputStream inFromServer = client.getInputStream();
                        DataInputStream in = new DataInputStream(inFromServer);
                        System.out.println("Server says " + in.readUTF());
                        String lineReadyToSend, lineGotFromServer;

                        while(cin.hasNextLine()) {
                                if(cin.hasNextLine()) {
                                        // EOT means End Of Transmission
                                        lineReadyToSend = cin.nextLine();
                                        if(lineReadyToSend.equals("EOT")) {
                                                out.writeUTF(lineReadyToSend);
                                                break;
                                        }
                                        else out.writeUTF(lineReadyToSend);
                                }
                                if(in.available() != 0) {
                                        lineGotFromServer = in.readUTF();
                                        System.out.println("Message from server: " + lineGotFromServer);
                                }
                        }

                        out.writeUTF("EOT");
                        client.close();
                        System.out.println("End of transmission. Server disconnected");

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

2 个答案:

答案 0 :(得分:0)

您使用的是cin,它是System.in

的扫描仪

实际上只扫描控制台上是否有输入的行。也许尝试使用服务器上的数据输入流(in)。

答案 1 :(得分:0)

嗯,一切看起来都很神。只是一个提示,你是否同时执行这两个应用程序?好吧,如果是这种情况,可以访问System.in资源。请记住,这是一个静态字段,并未实例化。尝试在其他位置运行其中一个。第二个提示:使用try子句并观察错误,并使用debuging或资源监视工具来检测问题。