Android套接字编程...给出了什么?

Jac*_*ack 3 sockets android http

所以我已经搜索了网络(主要是SO,谷歌),以找到Android的套接字编程的好例子.我做了很多Android开发(只是没有套接字).我不明白为什么我的readLine()总是返回NULL.请忽略这些可怕的代码,这对于朋友来说是一个快速而肮脏的原型.我的总体目标是建立与服务器的连接,发送标题数据(GET/MOUNTPOINT Content-Type:... etc ...),并根据我需要继续流或关闭的响应接收响应它.这是我最近的尝试代码:

                    String userPass = new     String(Base64.encodeToString("user:password".getBytes(),     Base64.DEFAULT));
            boolean connected = false;
            String requestmsg = "GET /MOUNTPOINT" + " HTTP/1.0\r\n";
            requestmsg += "User-Agent: MYCUSTOMAGENT\r\n";
            requestmsg += "Accept: */*\r\n";
            requestmsg += "Connection: close\r\n";

            requestmsg += "Authorization: Basic " + userPass;

            requestmsg += "\r\n";
            DataOutputStream dos =  null;
            DataInputStream dis = null;
            try {

                Log.d("ClientActivity", "Connecting...");
                Socket socket = new Socket("1.2.3.4", 9000);
                connected = true;
                String data = "";

                while (connected) {
                    try {
                        Log.d("ClientActivity", "C: Sending command.");

                        dos = new DataOutputStream(socket.getOutputStream());
                        dis = new DataInputStream(socket.getInputStream());

                        dos.write(requestmsg.getBytes());
                        Log.i("ClientActivity", "RequestMsg Sent");

                        StringBuilder sb = new StringBuilder();

                        while ((data = dis.readLine()) != null)
                            {
                                sb.append(data);
                            }
                            Log.i("ClientActivity", "C: Sent.");
                    } catch (Exception e) {
                        Log.e("ClientActivity", "S: Error", e);

                    }
                }
                socket.close();
                Log.d("ClientActivity", "C: Closed.");
            } catch (Exception e) {
                Log.e("ClientActivity", "C: Error", e);
                connected = false;
            }
Run Code Online (Sandbox Code Playgroud)

我已经尝试使用HttpClient API,但它在标题中插入了"GET /"消息,我需要指定"GET/MOUNTPOINT".另外我不知道HttpClient是否允许流式传输.我也尝试过URLConnection,但它默认也会插入GET或POST.谢谢你的帮助!

我也尝试过以下方法:

SocketAddress sockaddr = new InetSocketAddress("1.2.3.4", 9000);
nsocket = new Socket();

nsocket.connect(sockaddr, 10 * 1000); // 10 second connection timeout
    if (nsocket.isConnected()) {
        //nsocket.setSoTimeout(20 * 1000); // 20 second timeout once data is flowing
        nis = nsocket.getInputStream();
        nos = nsocket.getOutputStream();
        Log.i(NTAG, "Socket created, streams assigned");
        // Build request message
        requestmsg = "GET /MOUNTPOINT" + " HTTP/1.0\r\n";
        requestmsg += "User-Agent: MYANDROIDAGENT\r\n";
        requestmsg += "Accept: */*\r\n";
        requestmsg += "Connection: close\r\n";
        requestmsg += "Authorization: Basic " + userPass;
        requestmsg += "\r\n";

        nos.write(requestmsg.getBytes());


        nos.write(genGPGGA().getBytes());
        Log.i(NTAG, "Waiting for inital data...");
        byte[] buffer = new byte[4096];
        int read = nis.read(buffer); // This is blocking
        //Log.i("ReadNTRIP", tempdata.toString());
        String test = "TESTING";

        while (read != -1) {
            tempdata = new byte[read];
            System.arraycopy(buffer, 0, tempdata, 0, read);
            read = nis.read(buffer, 0, 4096); // This is blocking

        }
    }
} catch (SocketTimeoutException ex) {
    ex.printStackTrace();
} catch (Exception e) {
    e.printStackTrace();
} finally {
    try {
        nis.close();
        nos.close();
        nsocket.close();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
    Log.i(NTAG, "Finished");

}
Run Code Online (Sandbox Code Playgroud)

但是read总是返回-1.我准备把头发拉出来.

编辑:我添加了一个赏金(值得很少) - 我没有太多代表给予,但这个问题已经成为我的一个显示阻止.为了得到赏金,写一个简单的android程序连接到thor.lsu.edu,端口9000,发送一个简单的GET/HTTP/1.0命令并实际获取数据(使用套接字 - 不能与URLConnection或HttpClient).发布程序和结果的屏幕截图.我尝试了很多不同的方法,我不知道还能做什么(使用InputStreams,BufferedInputStreams,InputStreamReaders等...).我甚至使用了一个示例Android程序(THAT WORKS),但我仍然没有在我的实现中获取数据.我不知道它是时间问题还是什么问题.

谢谢

编辑:我注意到我甚至无法浏览到Androids浏览器中的http://thor.lsu.edu:9000.它给出了数据连接问题.知道为什么这个端口可能被阻止了吗?

Jus*_*ler 9

我所做的只是对您的代码进行了一些修改.我认为主要的变化就是不使用DataInputStream,因为文档明确表示不再对此数据结构使用readLine().http://download.oracle.com/javase/1.4.2/docs/api/java/io/DataInputStream.html#readLine%28%29

我也删除了授权内容,因为它不是必需的.如果您在某处运行此代码,您会注意到日志打印出HTTP响应.

String requestmsg = "GET /MOUNTPOINT" + " HTTP/1.0\r\n";
    requestmsg += "User-Agent: MYCUSTOMAGENT\r\n";
    requestmsg += "Accept: */*\r\n";
    requestmsg += "Connection: close\r\n";

    // requestmsg += "Authorization: Basic " + userPass;

    requestmsg += "\r\n";
    DataOutputStream dos = null;
    BufferedReader dis = null;
    try {

        Log.d("ClientActivity", "Connecting...");
        Socket socket = new Socket("thor.lsu.edu", 9000);
        String data = "";

        try {
            Log.d("ClientActivity", "C: Sending command.");

            dos = new DataOutputStream(socket.getOutputStream());
            dis = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            dos.write(requestmsg.getBytes());
            Log.i("ClientActivity", "RequestMsg Sent");

            StringBuilder sb = new StringBuilder();

            while ((data = dis.readLine()) != null) {
                sb.append(data);
            }
            Log.i("ClientActivity", "C: Sent.");
            Log.i("ClientActivity", "C: Received " + sb.toString());
        } catch (Exception e) {
            Log.e("ClientActivity", "S: Error", e);

        }

        socket.close();
        Log.d("ClientActivity", "C: Closed.");
    } catch (Exception e) {
        Log.e("ClientActivity", "C: Error", e);
    }
Run Code Online (Sandbox Code Playgroud)