安卓开发笔记——Socket使用方法

何为Socket?我们常将Socket翻译为套接字,Socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。

笔者在做物联网智能监控系统APP过程中,需要实现手机客户端向后台服务器端发送Socket,于是写了一个客户端demo,实现三个简单的小功能“连接”、“发送”、“取消连接”:
在这里插入图片描述
Client:

package com.xy.socket;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class SocketActivity extends AppCompatActivity {
    private EditText mEditText;
    private TextView mTextView;
    private View view1;
    private View view2;
    private View view3;
    private Button btn1;
    private Button btn2;
    private Button btn3;
    private static final String TAG = "TAG";
    private static final String HOST = "192.168.XXX.XXX";      //ip地址
    private static final int PORT = 12345;     //端口号
    private PrintWriter printWriter;
    private BufferedReader in;
    private ExecutorService mExecutorService = null;
    private String receiveMsg;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mEditText = (EditText) findViewById(R.id.mEditText);
        mTextView = (TextView) findViewById(R.id.mTextView);
        btn1 = (Button) findViewById(R.id.btn1);
        btn2 = (Button) findViewById(R.id.btn2);
        btn3 = (Button) findViewById(R.id.btn3);
        mExecutorService = Executors.newCachedThreadPool();
        
        **//为三个按钮设置监听**
        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                connect(view1);
            }
        });
        
        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                send(view2);
            }
        });
        
        btn3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                disconnect(view3);
            }
        });
    }

    public void connect(View view) {
        mExecutorService.execute(new connectService());
    }

    public void send(View view) {
        String sendMsg = mEditText.getText().toString();
        Log.e(TAG, ("connectService:" + sendMsg));
        mExecutorService.execute(new sendService(sendMsg));
    }

    public void disconnect(View view) {
        mExecutorService.execute(new sendService("0"));
    }

    private class sendService implements Runnable {
        private String msg;

        sendService(String msg) {
            this.msg = msg;
        }

        @Override
        public void run() {
            printWriter.println(this.msg);
        }
    }

    private class connectService implements Runnable {
        @Override
        public void run() {
            try {
                Socket socket = new Socket(HOST, PORT);
                socket.setSoTimeout(60000);
                printWriter = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
                socket.getOutputStream(), "UTF-8")), true);
                in = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
              } catch (Exception e) {
                Log.e(TAG, ("connectService:" + e.getMessage()));
            }
        }
    }
}

服务端可以使用 TCP Test Tool 小工具进行测试(图为向后台服务器发送十六进制数据):
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_38233258/article/details/88996903