从Android上的套接字获取数据

时间:2015-08-27 20:28:38

标签: java android sockets

所以我有这个非常非常奇怪的问题,使用socket从服务器获取数据,该服务器正在我的PC上运行到Android应用程序。现在都在本地网络中。 这很奇怪,因为我编写了服务器和客户端应用程序(都使用套接字)来发送和获取数据,它的工作效果非常好。我尝试在Android上做同样的事情,它只从服务器获得第一个响应,但在发送令牌后却没有得到其余的响应。 我搜索了SO,并看到了一些建议,即available()方法不对,所以我改变了它,它仍然没有按照我希望的那样工作。 我认为服务器端应用程序或Android应用程序的工作方式有问题,对于服务器来说太快了,它在android上结束传输后发送数据,但我试着给它一点时间而且没什么......

这是服务器应用程序(通常它获取令牌,让我们说" RAM"然后它从linux进程输出并直接发送到Android应用程序):

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

public class BLCServer extends Thread{
private ServerSocket serverSocket;

public BLCServer(int port) throws IOException {
    serverSocket = new ServerSocket(port);
    serverSocket.setSoTimeout(86400000);
}

public void run() {
    while(true) {
        try {
            String token = "";
            System.out.println("Waiting for a client on port: "+serverSocket.getLocalPort());
            Socket server = serverSocket.accept();
            System.out.println("Just connected to " + server.getRemoteSocketAddress());
            System.out.println("Beginning transmission");

            DataInputStream in = new DataInputStream(server.getInputStream());
            System.out.println(in.readUTF());

            DataOutputStream out = new DataOutputStream(server.getOutputStream());
            out.writeUTF("Thanks for connecting to " + server.getLocalSocketAddress() + "Goodbye\n");


            while(token != "END") {
                token = in.readUTF();
                if(token.equals("RAM")) {
                    Ram ram = new Ram();
                    List<String> ramData = new ArrayList<>();
                    ramData = ram.getRamData();
                    System.out.println("RAM");
                    System.out.println("ram.size(): " + ramData.size());

                    out.writeUTF("ramBeginning");

                    for(String x : ramData) {
                        System.out.println("Wysyłam do clienta: " + x);
                        out.writeUTF(""+x);
                    }
                    out.writeUTF("ramEnd");

                } else if(token.equals("CPU")) {
                    Cpu cpu = new Cpu();
                    List<String> cpuData = new ArrayList<>();
                    cpuData = cpu.getCpuLoad();
                    System.out.println("CPU");

                    out.writeUTF("cpuBeginning");
                    for(String x : cpuData) {
                        out.writeUTF(x);
                    }
                    out.writeUTF("cpuEnd");

                } else if(token.equals("STORAGE")) {
                    Storage storage = new Storage();
                    List<String> storageData = new ArrayList<>();
                    storageData = storage.printStorageData();
                    System.out.println("STORAGE");

                    out.writeUTF("storageBeginning");
                    for(String x : storageData) {
                        out.writeUTF(x);
                    }
                    out.writeUTF("storageEnd");

                } else if(token.equals("UPTIME")) {
                    Uptime uptime = new Uptime();
                    String uptimeData = uptime.getUptime();
                    System.out.println("UPTIME");

                    out.writeUTF("uptimeBeginning");
                    out.writeUTF(uptimeData);

                    out.writeUTF("uptimeEnd");

                } else if(token.equals("TEMPERATURES")) {
                    out.writeUTF("temperaturesBeginning");


                    out.writeUTF("temperaturesEnd");


                } else if(token.equals("END")) {
                    break;
                } else {
                    out.writeUTF("Token unknown");
                }
            }


            server.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 = 1984;
    try {
        Thread t = new BLCServer(port);
        t.start();
    } catch(IOException e) {
        e.printStackTrace();
    }
}

}

还有android主要活动:

public class MyActivity extends Activity {

TextView cpuT;
TextView ramT;
TextView uptimeT;
TextView storageT;

List<String> ram = new ArrayList<String>();
List<String> cpu = new ArrayList<String>();
List<String> uptime = new ArrayList<String>();
List<String> storage = new ArrayList<String>();
List<String> temperatures = new ArrayList<String>();


public class NetThread extends AsyncTask<String, Void, Void> {

    String dstAddress = "192.168.0.111";
    int dstPort = 1984;


    @Override
    protected Void doInBackground(String... args) {

        Socket socket = null;
        try {
            socket = new Socket(dstAddress, dstPort);
            OutputStream outToServer = socket.getOutputStream();
            DataOutputStream out = new DataOutputStream(outToServer);

            InputStream inFromServer = new PushbackInputStream(socket.getInputStream());
            DataInputStream in = new DataInputStream(inFromServer);

            out.writeUTF("Hello from " + socket.getLocalSocketAddress());

            int singleByte;
            ramT.setText(in.readUTF());

            out.writeUTF("RAM");

            while((singleByte = inFromServer.read()) != -1) { // there was code like: while(in.available() > 0) { ... } but someone wrote about it's bad behaviour on SO
                ramT.setText(ramT.getText() + "\n" + singleByte);
            }
            }

            out.writeUTF("END");
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }


        return null;
    }

}
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Log.d("WEBSERVICE", "Oncreate wywołane\n");
    cpuT = (TextView) findViewById(R.id.displayCpu);
    ramT = (TextView) findViewById(R.id.displayRam);
    uptimeT = (TextView) findViewById(R.id.displayUptime);
    storageT = (TextView) findViewById(R.id.displayStorage);



    NetThread netThread = new NetThread();
    netThread.execute("RAM", "STORAGE", "UPTIME");

}

}

另外我粘贴你的pc客户端应用程序:

public class BLCClient {
public static void main(String[] args) {
    String serverName = "localhost";
    int port = 1984;

    try {
        System.out.println("Connecting to..."+serverName+" on port 1984");
        Socket client = new Socket(serverName, port);
        System.out.println("Just connected to "+client.getRemoteSocketAddress());
        OutputStream outToServer = client.getOutputStream();
        DataOutputStream out = new DataOutputStream(outToServer);

        InputStream inFromServer = client.getInputStream();
        DataInputStream in = new DataInputStream(inFromServer);

        Scanner cin = new Scanner(System.in);
        String token = "";

        out.writeUTF("Hello from " + client.getLocalSocketAddress());
        System.out.println("Server says: "+in.readUTF());

        while(true) {
            System.out.println("Podaj token ciulu: ");
            token = cin.nextLine();
            System.out.println("Twój token: " + token);

            if(token.equals("END")) {
                out.writeUTF(token);
                break;
            } else {
                out.writeUTF(token);
                System.out.println(in.readUTF());
                System.out.println("IN: " + in.available());
                while(in.available() > 0) {
                    System.out.println(in.readUTF());
                }
            }
        }

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

}

是。我使用了tutorialspoint.com的部分代码。如果您需要用于获取ram,cpu,存储,温度或正常运行时间数据的类,请通知我。 现在我花了大约4天时间试图找出我的Android代码有什么问题(因为服务器正确地发送数据,我99%肯定)。请帮我。我无能为力,我希望这个应用程序唤醒工作如此糟糕(实际上我使用tomcat服务器完成了这项工作,但我想在这里使用自己的服务器)。

感谢。

0 个答案:

没有答案