最近项目要用到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();
}
}
}
}