Android socket TCP使用笔记。

本文提供了一个简单的Java Socket通信示例,包括服务端与客户端的实现。服务端使用ServerSocket监听端口并接受客户端连接请求,客户端通过Socket连接服务端并发送消息。文章详细展示了如何进行双向通信。

首先是服务端代码,

public class MyServer {

    private static String TAG = "--MyServer";

    private int post = 9005;

    public static void main(String[] args) {

        //创建线程池
        ExecutorService es = Executors.newCachedThreadPool();

        try {
            System.out.println(TAG + "开始运行server");
            final ServerSocket serverSocket = new ServerSocket(9005);

            while (true) {

                //accept是线程阻塞的
                final Socket accept = serverSocket.accept();

                es.execute(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            InputStream inputStream = accept.getInputStream();
                            InputStreamReader ir = new InputStreamReader(inputStream);
                            BufferedReader br = new BufferedReader(ir);

                            String info = null;
                            int index;
                            while ((info = br.readLine()) != null) {
                                System.out.println(TAG + "服务端接收info: " + info);
                                if ((index = info.indexOf("eof")) != -1) {
                                    break;
                                }
                            }

                            //accept.shutdownInput(); 不能关闭,关闭就不能再接收消息了
                            //响应客户端
                            OutputStream outputStream = accept.getOutputStream();
                            PrintWriter pw = new PrintWriter(outputStream);
                            pw.write("你成功吸引了我的注意力");
                            pw.flush();
                            outputStream.close();
                            pw.close();

                            br.close();
                            inputStream.close();
                            ir.close();

                            accept.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

服务端的右键run就可以跑起来,然后是客户端的代码:

public class ClientActivity extends AppCompatActivity {

    @SuppressLint("HandlerLeak")
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            String info = (String) msg.obj;

            mTextView.setText("服务端返回:" + info);
        }
    };

    private EditText mEditText;
    private TextView mTextView;
    private Socket mSocket;
    private Button btn_send;

    //创建线程池
    ExecutorService mExecutorService = Executors.newCachedThreadPool();

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ca);


        mEditText = (EditText) findViewById(R.id.et_content);
        mTextView = (TextView) findViewById(R.id.tv_message);
        btn_send = (Button) findViewById(R.id.btn_send);

        //连接服务端,ip换成自己电脑的ip,服务器设置的端口。
        mExecutorService.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    mSocket = new Socket("192.168.1.102", 9005);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

        //发送输入框的内容
        btn_send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String s = mEditText.getText().toString();
                send(s);
            }
        });
    }

    private void send(final String info) {

        mExecutorService.execute(new Runnable() {
            @Override
            public void run() {

                try {
                    mSocket = new Socket("192.168.1.102", 9005);
                    OutputStream os = mSocket.getOutputStream();
                    PrintWriter pw = new PrintWriter(os);
                    pw.write(info);
                    pw.write("eof\n");
                    pw.flush();

                    InputStream inputStream = mSocket.getInputStream();
                    BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));

                    String info = null;
                    int index;
                    while ((info = br.readLine()) != null) {
                        if ((index = info.indexOf("eof")) != -1) {
                            break;
                        }
                        Message message = Message.obtain();
                        message.obj = info.substring(0, info.length()-3);
                        mHandler.sendMessage(message);
                    }

                    inputStream.close();
                    br.close();
                    os.close();
                    pw.close();

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }

}

是的就2个类,就可以发消息给服务端了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值