您的位置:首页 > 理论基础 > 计算机网络

网络通信

2016-03-02 13:43 507 查看
掌握使用异步任务进行网络通信,让应用在网络世界更加灵活自如

一.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();
}
}
}

4000
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与服务器通信。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: