每隔一段时间输出一次

时间:2014-10-24 06:28:50

标签: java android sockets tcp google-glass

我创建了一个应用程序,它通过一个线程打开一个套接字,并根据输入的内容进行更新。这是代码:

Server.java:

public class Server {
    public static void main(String[] args) throws IOException {
        int portNumber = 2392;

        boolean listening = true;

        System.out.println("Server: Running...");

        try (ServerSocket serverSocket = new ServerSocket(portNumber)) {
            System.out.println("Server: Connected to Client!");
            while (listening) {
                new ServerThread(serverSocket.accept()).start();
            }
        } catch (IOException e) {
            System.out.println("Exception caught when trying to listen on port "
                + portNumber + " or listening for a connection( '" + e.getMessage() + "' );");
        } finally {

            System.out.println("Server: Disconnecting...");
        }
    }
}

服务器Thread.java:

public class ServerThread extends Thread  {
    private Socket socket = null;
    Scanner reader = new Scanner(System.in);

    public ServerThread(Socket socket) {
        super("ServerThread");
        this.socket = socket;
    }

    public void run() {
        System.out.println("Ruasd");

        try (PrintWriter out = new PrintWriter(socket.getOutputStream(), true)) {
            String outputLine = "";
            while (!outputLine.equals("Disconnect")) {
                outputLine = reader.nextLine();
                out.println(outputLine);
            }
            socket.close();
            reader.close();

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

Client.java:

public class MainActivity extends Activity {

    private Socket socket;
    private TextView status;

    private BufferedReader in;
    private Handler mHandler;

    private static final int SERVERPORT = 2392;
    private static final String SERVER_IP = "...ip#...";


    @Override
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);

        setContentView(R.layout.activity_vitals);
        status = (TextView) findViewById(R.id.text_status);

        new Thread(new CommunicationThread()).start();
    }

    @Override
    protected void onStop() {
        super.onStop();

        if (in != null) {
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

class CommunicationThread implements Runnable {
    @Override
    public void run() {
        try {
            InetAddress serverAddr = InetAddress.getByName(SERVER_IP);

            socket = new Socket(serverAddr, SERVERPORT);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            while (true) {
               final String fromServer = in.readLine();
               System.out.println("Server: " + fromServer);

                MainActivity.this.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        // This code will always run on the UI thread, therefore is safe to modify UI elements.
                        status.setText(fromServer);
                    }
                });

                if (fromServer.equals("Disconnect."))
                    break;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

第一次完美运行并正确输出到status TextView。但是,当我重新启动应用程序时,它会输出所有其他单词。例如,如果我键入"嘿" "嗨"你" "怎么",我会看到"嗨"和"如何"在TextView第二次启动应用程序时。

对我来说真的很奇怪的是,当我System.out.println("Server: " + fromServer)时,它会输出所有值。非常感谢任何建议。

1 个答案:

答案 0 :(得分:0)

好的我觉得我发现了问题(让它为我工作,就是这样)。在你的CommunicationThread中,你没有一个while循环。此外,您需要迭代服务器的输入,直到它为空。见下文:

class CommunicationThread implements Runnable {
    @Override
    public void run() {
        try {
            // keep the connection alive.
            while (true) {
                InetAddress serverAddr = InetAddress.getByName(SERVER_IP);

                socket = new Socket(serverAddr, SERVERPORT);
                BufferedReader in = new BufferedReader(
                    new InputStreamReader(socket.getInputStream()));

                String fromServer;
                // get server messages until there are none
                while ((fromServer = in.readLine()) != null) {

                    System.out.println("Server: " + fromServer);

                    MainActivity.this.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            // This code will always run on the UI thread, therefore is safe to modify UI elements.
                            status.setText(fromServer);
                        }
                    });

                    if (fromServer.equals("Disconnect."))
                        break;

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

请回复我的说明:)

相关问题