[Android开发] Android客户端使用socket通信

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值