Android作为客户端(client)对服务器(server)进行request操作,并从服务器中得到response。
这里主要使用socket来进行数据传输。
注意
- 若SDK version > 9,则需要加入
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
否则会有Error: SocketException: socket failed: EACCES (Permission denied).
- socket的相关操作不能放在UI线程中,否则会有Error: android.os.NetworkOnMainThreadException
代码
在activity_main.xml中加了一个用于用户输入消息的editText,一个发送消息的button,一个显示接收消息的textView。
发送与接收数据可以是string,也可以是object。
若是object的话记得类要implements java.io.Serializable
。
- MainActivity.java
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.StrictMode;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.lang.ref.WeakReference;
import java.net.InetAddress;
import java.net.Socket;
import java.util.ArrayList;
public class MainActivity extends Activity {
public static final String HOST = "10.0.2.2";
public static final int PORT = 12345;
public final MyHandler mHandler = new MyHandler(this);
public EditText mEditText = null;
public TextView mTextView = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
mEditText = (EditText) findViewById(R.id.editText);
mTextView = (TextView) findViewById(R.id.textView);
findViewById(R.id.button).setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Message message = mHandler.obtainMessage();
message.what = 1;
mHandler.sendMessage(message);
}
});
}
public static class MyHandler extends Handler {
private final WeakReference<MainActivity> mActivity;
public MyHandler(MainActivity activity) {
mActivity = new WeakReference<>(activity);
}
public void sendString(MainActivity activity) {
Socket socket = null;
try {
socket = new Socket(InetAddress.getByName(HOST), PORT);
// send message
String request = activity.mEditText.getText().toString() + "\n";
PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())),
true);
out.write(request);
out.flush();
// receive message
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
String response = in.readLine();
activity.mTextView.setText(response);
out.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
if (socket != null) {
socket.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void sendObject(MainActivity activity) {
Socket socket = null;
try {
socket = new Socket(InetAddress.getByName(HOST), PORT);
// send object
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
ArrayList<Point> points = new ArrayList<>();
points.add(new Point(-3, 3.14));
out.writeObject(points);
out.flush();
// receive object
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
Object obj = in.readObject();
points = (ArrayList<Point>) obj;
activity.mTextView.setText(points.toString());
out.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
if (socket != null) {
socket.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void handleMessage(Message msg) {
MainActivity activity = mActivity.get();
if (activity != null) {
switch (msg.what) {
case 0:
sendString(activity);
break;
case 1:
sendObject(activity);
break;
}
}
}
}
}
- Point.java
public class Point implements java.io.Serializable {
public double x, y;
public Point(double x, double y) {
this.x = x;
this.y = y;
}
}