Android与服务器通讯小结

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();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容