网络通信

掌握使用异步任务进行网络通信,让应用在网络世界更加灵活自如

一.Android异步任务处理

1.读写网络数据、大量计算等,为了不让这些耗时的任务影响界面响应,就应当使用异步任务进行处理。
2.多线程的概念。
3.AsyncTask的使用方法。

包括传入参数、设定后台任务、过程信息的处理等

package com.gst.user.myapplication;

import android.media.MediaPlayer;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.TextView;

import com.lidroid.xutils.util.LogUtils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class FileActivity extends AppCompatActivity {

    TextView textView;
    String url;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_file);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
        textView =(TextView)findViewById(R.id.textView2);
        url="https://www.baidu.com";
   }

    public void read(View view){
        new ReadURLTask().execute(url);
    }

    class ReadURLTask extends AsyncTask<String,Integer,String>{

        @Override
        protected String doInBackground(String... params) {
            try {
                URL url=new URL(params[0]);
                URLConnection connection=url.openConnection();
                InputStream inputStream=connection.getInputStream();
                InputStreamReader inputStreamReader=new InputStreamReader(inputStream);
                BufferedReader reader=new BufferedReader(inputStreamReader);
                String line;
                StringBuffer stringBuffer=new StringBuffer();
                while ((line=reader.readLine())!=null){
                    stringBuffer.append(line);
        //            publishProgress(stringBuffer.toString().getBytes().length/total);
                }
                return stringBuffer.toString();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            LogUtils.i(String.valueOf(values[0]));
            super.onProgressUpdate(values);
        }

        @Override
        protected void onPostExecute(String s) {
            textView.setText(s);
            super.onPostExecute(s);
        }
    }
}

二.Android中基于HTTP的通信技术

作为移动平台的应用,一定避免不了与网络交换数据,不论是读取网页数据,还是调用API接口,都必须掌握Http通信技术。

1.Http的Get与Post方式与服务器通信。
2.使用HttpClient进行Get或Post通信。

三.Android中基于Socket的网络通信

1.Socket通信的概念。

Socket通信是网络通信中最常用的技术之一,通过Socket建立的可靠连接,可以让多个终端与服务器保持通信,最典型的应用是建立一个多人聊天程序。
1.Socket链接建立的过程
服务器监听
客户端发出请求
建立连接
通信
2.Socket特点
Socket基于Tcp连接,数据传输有保障
Socket适用于建立长时间的连接
Socket编程通常应于即时通讯


3.创建ServerSocket服务器。

ChatManager.java

package com.gst.user.myapplication;

import java.util.Vector;

/**
 * 项目名称:My Application
 * 类描述:
 * 创建人:user
 * 创建时间:3/2/16 9:41 AM
 * 修改人:user
 * 修改时间:3/2/16 9:41 AM
 * 修改备注:
 */
public class ChatManager {
    private static ChatManager chatManager=new ChatManager();
    private Vector<MutiTouchActivity.ChatScoket> chatScokets=new Vector<>();

    private ChatManager() {

    }

    public static ChatManager getChatManager(){
        return chatManager;
    }

    public void add(MutiTouchActivity.ChatScoket chatScoket){
        chatScokets.add(chatScoket);
    }

    public void publish(MutiTouchActivity.ChatScoket chatScoket,String out){
        for (int i = 0; i < chatScokets.size(); i++) {
            MutiTouchActivity.ChatScoket temp=chatScokets.get(i);
            if (!chatScoket.equals(temp)){
                temp.out(out);
            }
        }
    }

安卓服务器

package com.gst.user.myapplication;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

import com.lidroid.xutils.util.LogUtils;

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

public class MutiTouchActivity extends AppCompatActivity {
    String[] strings=new String[]{"Spring","Summer","Autumn","winter"};
    int index=0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_muti_touch);

        new ServerListener().start();
    }

    class ServerListener extends Thread{
        @Override
        public void run() {
            //port 1-65535
            try {
                ServerSocket serverSocket=new ServerSocket(12345);
                while (true){
                    Socket socket=serverSocket.accept();
                    LogUtils.i("有客户端连接到本机的12345端口");
                    //聊天线程
                    ChatScoket chatScoket=new ChatScoket(strings[index++],socket);
                    chatScoket.start();
                    //加入管理
                    ChatManager.getChatManager().add(chatScoket);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    class ChatScoket extends Thread{
        String name;
        Socket socket;

        public String getChatName() {
            return name;
        }

        public ChatScoket(String name, Socket socket) {
            this.name = name;
            this.socket = socket;
        }

        @Override
        public void run() {
 /*           try {
*//*
                OutputStream outputStream=socket.getOutputStream();
                OutputStreamWriter outputStreamWriter=new OutputStreamWriter(outputStream);
                BufferedWriter writer=new BufferedWriter(outputStreamWriter);
*//*
                int count=1;
                while (true){
                     out("loop"+(count++)+"\n");
                     sleep(1000);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }*/

            try {
                BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String line=null;
                while ((line=reader.readLine())!=null){
                    ChatManager.getChatManager().publish(this,getChatName()+":"+line+"\n");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public void out(String s){
            try {
                socket.getOutputStream() .write(s.getBytes());
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}
4.客户端使用Socket与服务器通信。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值