安卓 | 使用AsyncTask进行Socket编程

时间:2022-08-13 22:42:26

AsyncTask是什么

AsyncTask 允许对用户界面执行异步操作。 它会先阻塞工作线程中的操作,然后在 UI 线程中发布结果,而无需您亲自处理线程和/或处理程序

其实AsyncTask就是安卓帮我们对异步处理机制进行了封装的一个类,方便我们进行异步操作。

1、可以使用泛型指定参数类型、进度值和任务最终值
2、方法 doInBackground() 会在工作线程上自动执行
3、onPreExecute()、onPostExecute() 和 onProgressUpdate() 均在 UI 线程中调用
4、doInBackground() 返回的值将发送到 onPostExecute()
5、您可以随时在 doInBackground() 中调用publishProgress(),以在 UI 线程中执行 onProgressUpdate()
6、您可以随时取消任何线程中的任务

必须实现doInBackground(),此处代码不在主线程(UI线程)运行,参数类型为泛型参数的第一个(另外注意参数是可变参数):

private class ClientTask extends AsyncTask<String,Void,String>
{

@Override
protected String doInBackground(String... params) {

}
}

Socket是什么

Socket是网络连接时使用的接口。有服务器端和客户机端:ServerSocket用于服务器端,Socket是客户端

服务器端:

① 创建ServerSocket对象,绑定监听端口
② 通过accept()方法监听客户端请求(accept是阻塞式的
③ accept获得一个连接(socket实例)后,可以通过输入流读取客户端发送的信 息,通过输出流向客户端发送乡音信息
④通常用死循环保证一直在线

客户端

① 创建Socket对象,指明需要连接的服务器的地址端口号
② 可以通过输出流想服务器端发送信息,通过输入流获取服务器响应的信息

简单的实例

下面来做一个简单的实例,首先构建一个服务器,它只接收来自客户端的信息并把它显示在textView当中

服务器端

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class MainActivity extends AppCompatActivity {

final int port = 6688;
protected TextView textView = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView)findViewById(R.id.text);

//实例化一个AsyncTask,并开启
ServerTask serverTask = new ServerTask();
serverTask.execute(port);

}

public class ServerTask extends AsyncTask<Integer,String,Void> {
String msgFromClient = null;
String expMsg = null;
@Override
protected Void doInBackground(Integer... port) {
try {
while(true)
{
msgFromClient = "";
ServerSocket serverSocket = new ServerSocket(port[0]);//占用端口6688
Socket client = serverSocket.accept();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(client.getInputStream()));

String line;
while((line = bufferedReader.readLine()) != null)
{
msgFromClient = msgFromClient + line;
}
serverSocket.close();
//利用publishProgress更新UI,把当前接收的信息显示出来
publishProgress(msgFromClient == null ? "get nothing" : msgFromClient);
}

}catch (Exception e)
{
expMsg = e.getMessage();
Log.d("network","Server can't connected");
}
return null;
}

@Override
protected void onProgressUpdate(String... msg) {
super.onProgressUpdate(msg);
textView.setText(msg[0]);
}
}
}

客户端:

输入要连接的服务器IP地址以及要发送的内容,点击send发送到服务器端

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

public class MainActivity extends AppCompatActivity {
EditText textView = null;
EditText ipText= null;
Button button = null;
String port = "6688";
String ip = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (EditText)findViewById(R.id.text);
button = (Button)findViewById(R.id.button);
ipText = (EditText)findViewById(R.id.IPtext);

button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ClientTask clientTask = new ClientTask();
//传入IP地址,端口号,以及要发送的内容
clientTask.execute(ipText.getText().toString(),port,textView.getText().toString());
}
});

}


private class ClientTask extends AsyncTask<String,Void,String>
{

//ip = string[0] port = string[1] text_toSend = string[2]
@Override
protected String doInBackground(String... params) {
try {
Socket socket = new Socket(params[0],Integer.parseInt(params[1]));
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
printWriter.println(params[2]);
printWriter.flush(); //记得刷新缓冲区
socket.close();
}catch (IOException e)
{
Log.d("network",e.getMessage());
}
return "OK";
}
}
}

效果展示

客户端:

安卓 | 使用AsyncTask进行Socket编程

服务器:

安卓 | 使用AsyncTask进行Socket编程