Android Socket初探

最近项目要用到socket通信,所以就研究了一下,首先socket分为两个端,一个是客户端socket,另一个是服务端serverSocket,首先说说他们的连接方式,都说是三次握手,这里不讲这个,看看他们连接的代码:

客户端

 
 
Socket socket = new Socket("192.168.1.1", 10010);

服务端

ServerSocket mServerSocket = new ServerSocket(SERVER_PORT);
Socket  mSocket = mServerSocket.accept();

有两个流,输入和输出流。输入流主要用来接收对方发过来的消息,输出流主要用来发送消息给对方

 InputStream inputStream = mSocket.getInputStream();
 OutputStream opStream = mSocket.getOutputStream();

客户端demo

package com.example.socket.client;

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

import org.json.JSONException;
import org.json.JSONObject;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "SocketDemo";
    private EditText et;
    private Socket socket;

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

        et = findViewById(R.id.et);
        Button connect = findViewById(R.id.btn_connect);
        Button send = findViewById(R.id.btn_send);
        Button over = findViewById(R.id.btn_over);


        connect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        while (true) {
                            try {
                                socket = new Socket(et.getText().toString().trim(), 9999);
                                InputStream inputStream = socket.getInputStream();
                                byte[] buffer = new byte[1024];
                                int len;
                                StringBuffer sb = new StringBuffer();
                                Log.d(TAG, "client----begin--->>>>:");
                                while ((len = inputStream.read(buffer)) != -1) {
                                    String data = new String(buffer, 0, len);
                                    sb.append(data);
                                    Log.d(TAG, "client---receive-: " + data);
                                    try {
                                        JSONObject jsonObject = new JSONObject(data);
                                    } catch (JSONException e) {
                                        e.printStackTrace();
                                        Log.d(TAG, "json->>>>:" + e.getMessage());
                                    }
                                }
                                Log.d(TAG, "client---receive-完整消息: " + sb.toString());
                                Log.d(TAG, "client----end--->>>>:");
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }


                    }
                }).start();
            }
        });

        send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            if (socket != null) {
                                OutputStream outputStream = socket.getOutputStream();
                                outputStream.write("{\"cmd\": \"login\"}".getBytes());
                                outputStream.flush();
                            }

                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
            }
        });
        over.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            if (socket != null) {
                                OutputStream outputStream = socket.getOutputStream();
                                outputStream.write("EOF".getBytes());
                                outputStream.flush();
                                outputStream.close();
                            }

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

    }

}

服务端demo

package com.example.socket.serverclient;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "SocketDemo";
    private ServerSocket mServerSocket = null;
    private Socket mSocket = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new Thread(new Runnable() {
            @Override
            public void run() {

                while (true) {
                    try {
                        mServerSocket = new ServerSocket(9999);
                        mSocket = mServerSocket.accept();
                        InputStream inputStream = mSocket.getInputStream();
                        byte[] buffer = new byte[1024];
                        int len;
                        StringBuilder sb = new StringBuilder();
                        while ((len = inputStream.read(buffer)) != -1) {
                            String text = new String(buffer, 0, len);
                            if (text.equals("EOF")) {
                                break;
                            }
                            sb.append(text);
                            Log.d(TAG, "server receive " + sb.toString());
                        }
                        Log.d(TAG, "server receive 收到的完整消息 " + sb.toString());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }

    public void click(View view) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    if (mSocket != null) {
                        OutputStream outputStream = mSocket.getOutputStream();
                        outputStream.write("{\"cmd\": \"loginOut\"}".getBytes());
                        outputStream.flush();
//                        outputStream.close();
//                        mSocket.shutdownOutput();
                    }

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

    public void over(View view) {
        if (mSocket != null) {
            try {
                mSocket.getOutputStream().close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}




猜你喜欢

转载自blog.csdn.net/sinat_41268473/article/details/79687924
今日推荐