美文网首页
Android与服务器通讯小结

Android与服务器通讯小结

作者: 熊大哥87 | 来源:发表于2017-10-25 13:59 被阅读0次

Android Socket通信

  • 什么是Socket
    是一种抽象层,简单来说,Socket提供了程序内部与外界通讯的端口,并为双方提供了数据传输通道。
  • Socket分类
    根据不同的底层协议,Socket的实现是多样化的。我了解的是基于TCP/IP协议族,在这个协议族中主要的Socket类型为流套接字和数据套接字。流套接字将TCP作为其端对端协议,提供了一个值得信赖的字节流服务。数据报套接字使用UDP协议,提供数据打包发送服务。
  • Socket基本实现原理
    服务端首先声明一个Serversocket对象并且指定其端口号,然后调用accept()方法接受客户端数据。accept()方法在没接收到数据处于堵塞状态,一旦接受到数据,通过inputstream读取接受数据。
    客户端创建一个Socket对象,指定服务器端IP和端口号
Socket socket=new Socket(“127.0.0.1”,8080);
通过inputstream读取数据,获取服务器发出的数据
OutputStream os=socket.getOutputStream();
通过OutputStream发送数据

进行TCP协议Socket数据传输

  • 一般步骤
    1.打开连接
    2.取得outputstream和inputstream
    3.关闭连接
package com.example.sgcchj;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class ScoketUtils {
    private static Socket socket;
    private static InputStream is;
    private static InputStreamReader isr;
    private static BufferedReader br;
    private static OutputStream outputStream;
    public static void openlink(){
         try {
             // 创建Socket对象 & 指定服务端的IP 及 端口号
             socket = new Socket("192.168.0.102", 10086);
             // 判断客户端和服务器是否连接成功
             System.out.println(socket.isConnected()+"是否连接成功");
         } catch (IOException e) {
             e.printStackTrace();
         }
    }
    public static void readlink(){
         try {
               is = socket.getInputStream();
               isr = new InputStreamReader(is);
               br = new BufferedReader(isr);
               String response = br.readLine();
               System.out.println(response+"这是个啥");
         } catch (IOException e) {
             e.printStackTrace();
         }
    }
    public static void writelink(String data){
        try {
            outputStream = socket.getOutputStream();
            byte[] b=data.getBytes("utf-8");
            outputStream.write(b);
            outputStream.flush();
        } catch (IOException e) {
         
        }
    }
    public static void closelink(){
         try {
             if(outputStream!=null){
                 outputStream.close();
             }
             if(br!=null){
                br.close();
             }
             if(socket!=null){
                 socket.close();
                System.out.println(socket.isConnected());
            }
          } catch (IOException e) {
            
          }
    }
}

Android HTTP通信

  • 什么是HTTP协议
    HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。
    HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。
    HTTP是一个属于应用层的面向对象的协议,Http协议基于传输层的TCP协议,主要解决如何包装数据
  • Android开发调用
    Android中提供的HttpURLConnection和HttpClient(已过时,不在说)和开源的okhttp3接口可以用来开发HTTP程序。
1. HttpURLConnection接口
      首先需要明确的是,Http通信中的POST和GET请求方式的不同。GET可以获得静态页面,也可以把参数放在URL字符串后面,传递给服务器。而POST方法的参数是放在Http请求中。因此,在编程之前,应当首先明确使用的请求方法,然后再根据所使用的方式选择相应的编程方式。
      HttpURLConnection是继承于URLConnection类,二者都是抽象类。其对象主要通过URL的openConnection方法获得。创建方法如下代码所示: 
URL url = new URL("http://127.0.0.1/post.jsp");    
HttpURLConnection urlConn=(HttpURLConnection)url.openConnection(); 
通过以下方法可以对请求的属性进行一些设置,如下所示
//设置输入和输出流    
urlConn.setDoOutput(true);    
urlConn.setDoInput(true);    
//设置请求方式为POST    
urlConn.setRequestMethod("POST");    
//POST请求不能使用缓存    
urlConn.setUseCaches(false);   
//关闭连接    
urlConn.disConnection();   
Manifest文件中权限的设定:
Xml代码  
<uses-permission android:name="android.permission.INTERNET" />  
  
HttpURLConnection默认使用GET方式,例如下面代码所示: 
//以Get方式上传参数  
public class Activity1 extends Activity  
{  
    private final String DEBUG_TAG = "Activity1";   
     
    @Override  
    public void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.http);    
        TextView mTextView = (TextView)this.findViewById(R.id.tv_http);  
        //http地址"?id=1"是我们上传的参数  
        String httpUrl = "http://127.0.01:8080/index.jsp?id=1";  
        //获得的数据  
        String resultData = "";  
        URL url = null;  
        try  
        {  
            //构造一个URL对象  
            url = new URL(httpUrl);   
        }  
        catch (MalformedURLException e)  
        {  
            Log.e(DEBUG_TAG, "完犊子");  
        }  
        if (url != null)  
        {  
            try  
            {  
                // 使用HttpURLConnection打开连接  
                HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();  
                //得到读取的内容(流)  
                InputStreamReader in = new InputStreamReader(urlConn.getInputStream());  
                // 为输出创建BufferedReader  
                BufferedReader buffer = new BufferedReader(in);  
                String Line = null;  
                //使用循环来读取获得的数据  
                while (((Line = buffer.readLine()) != null))  
                {  
                    //我们在每一行后面加上一个"\n"来换行  
                    resultData += Line + "\n";  
                }           
                //关闭InputStreamReader  
                in.close();  
                //关闭http连接  
                urlConn.disconnect();  
                //设置显示取得的内容  
                if ( resultData != null )  
                {  
                    mTextView.setText(resultData);  
                }  
                else   
                {  
                    mTextView.setText("读取的内容为NULL");  
                }  
            }  
            catch (IOException e)  
            {  
                Log.e(DEBUG_TAG, "扯犊子");  
            }  
        }  
        else  
        {  
            Log.e(DEBUG_TAG, "Url NULL");  
        }  
}  
  如果需要使用POST方式,则需要setRequestMethod设置。代码如下:
//以post方式上传参数  
public class Activity2extends Activity  
{  
    private final String DEBUG_TAG = "Activity2";   
     
    @Override  
    public void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.http);  
          
        TextView mTextView = (TextView)this.findViewById(R.id.TextView_HTTP);  
        //http地址"?id=1"是我们上传的参数  
        String httpUrl = "http://192.168.1.110:8080/post.jsp";  
        //获得的数据  
        String resultData = "";  
        URL url = null;  
        try  
        {  
            //构造一个URL对象  
            url = new URL(httpUrl);   
        }  
        catch (MalformedURLException e)  
        {  
            Log.e(DEBUG_TAG, "MalformedURLException");  
        }  
        if (url != null)  
        {  
            try  
            {  
                // 使用HttpURLConnection打开连接  
                HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();  
                //因为这个是post请求,设立需要设置为true  
                urlConn.setDoOutput(true);  
                urlConn.setDoInput(true);  
                // 设置以POST方式  
                urlConn.setRequestMethod("POST");  
                // Post 请求不能使用缓存  
                urlConn.setUseCaches(false);  
                urlConn.setInstanceFollowRedirects(true);  
                // 配置本次连接的Content-type,配置为application/x-www-form-urlencoded的  
                urlConn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");  
                // 连接,从postUrl.openConnection()至此的配置必须要在connect之前完成,  
                // 要注意的是connection.getOutputStream会隐含的进行connect。  
                urlConn.connect();  
                //DataOutputStream流  
                DataOutputStream out = new DataOutputStream(urlConn.getOutputStream());  
                //要上传的参数  
                String content = "par=" + URLEncoder.encode("ABCDEFG", "gb2312");  
                //将要上传的内容写入流中  
                out.writeBytes(content);   
                //刷新、关闭  
                out.flush();  
                out.close();   
                //获取数据  
                BufferedReader reader = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));  
                String inputLine = null;  
                //使用循环来读取获得的数据  
                while (((inputLine = reader.readLine()) != null))  
                {  
                    //我们在每一行后面加上一个"\n"来换行  
                    resultData += inputLine + "\n";  
                }           
                reader.close();  
                //关闭http连接  
                urlConn.disconnect();  
                //设置显示取得的内容  
                if ( resultData != null )  
                {  
                    mTextView.setText(resultData);  
                }  
                else   
                {  
                    mTextView.setText("读取的内容为NULL");  
                }  
            }  
            catch (IOException e)  
            {  
                Log.e(DEBUG_TAG, "IOException");  
            }  
        }  
        else  
        {  
            Log.e(DEBUG_TAG, "Url NULL");  
        }  
    }  
} 
2.okhttp3接口
导入:compile 'com.squareup.okhttp3:okhttp:3.9.0'
Get请求
String url = "https://127.0.0.1/";
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder()
    .url(url)
    .build();
Call call = okHttpClient.newCall(request);
try {
    Response response = call.execute();
    System.out.println(response.body().string());
} catch (IOException e) {
    e.printStackTrace();
}
传参:
Request request = new Request.Builder()
    .url(url)
    .header(key, value)
    .build();
Post请求

String url = "https://127.0.0.1";
OkHttpClient okHttpClient = new OkHttpClient();
RequestBody body = new FormBody.Builder()
    .add(key, value)
    .build();
Request request = new Request.Builder()
    .url(url)
    .post(body)
    .build();
Call call = okHttpClient.newCall(request);
try {
    Response response = call.execute();
    System.out.println(response.body().string());
} catch (IOException e) {
    e.printStackTrace();
}
post请求创建request和get是一样的,post请求需要提交一个表单,就是RequestBody。
RequestBody body = new FormBody.Builder()
    .add(key, value)
    .build();

相关文章

网友评论

      本文标题:Android与服务器通讯小结

      本文链接:https://www.haomeiwen.com/subject/uugfpxtx.html