Recently, the project uses socket communication, so I studied it. First, the socket is divided into two ends, one is the client socket, and the other is the server socket. First of all, let’s talk about their connection method, which is said to be a three-way handshake. Here Without talking about this, take a look at the code where they connect:
client
Socket socket = new Socket("192.168.1.1", 10010);
Server
ServerSocket mServerSocket = new ServerSocket(SERVER_PORT); Socket mSocket = mServerSocket.accept();
There are two streams, input and output streams. The input stream is mainly used to receive messages from the other party, and the output stream is mainly used to send messages to the other party.
InputStream inputStream = mSocket.getInputStream(); OutputStream onStream = mSocket.getOutputStream();
client 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); and = findViewById(R.id.and); 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-full message: " + 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(); } }); } }
Server 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 received the complete message received" + 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 (); } } } }