主要是基于Socket来进行实现,Socket技术详解内容可读:https://www.jianshu.com/p/066d99da7cbd
直接上代码
Demo下载连接:https://download.csdn.net/download/qq_30574785/12170254
服务器端:
package top.weizhengzhou.tcpdemo.server;
import android.text.TextUtils;
import android.util.Log;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author wzz
* 服务器
*/
public class SocketServerConnect implements Runnable {
private String TAG = SocketServerConnect.class.getSimpleName();
/**
*负责接收客户连接请求,产生Socket
*/
private ServerSocket mServerSocket;
/**
* 用于保存接收到的Socket连接
*/
private Socket mSocket;
/**
* 获取Socket输入流
*/
private InputStream mInputStream;
/**
* 获取Socket输出流
*/
private OutputStream mOutputStream;
/**
* 回调事件监听
*/
private OnSocketServerConnectListener mOnSocketServerConnectListener;
/**
* 用于控制客户端数据读取
*/
private volatile boolean readData = true;
/**
* 服务器端口
*/
private int port;
public SocketServerConnect(int port) {
this.port = port;
}
/**
* 设置服务器监听
* @param onSocketServerConnectListener
*/
public void setOnSocketServerConnectListener(OnSocketServerConnectListener onSocketServerConnectListener) {
mOnSocketServerConnectListener = onSocketServerConnectListener;
}
@Override
public void run() {
try {
//开启服务器,并监听所设端口
mServerSocket = new ServerSocket(port);
if (mServerSocket == null) return;
//等待客户端连接,如未有客户端连接,则会一直进行等待
mSocket = mServerSocket.accept();
if (mSocket == null) return;
if (mOnSocketServerConnectListener!=null){
//客户端连接成功
mOnSocketServerConnectListener.onSocketServerConnectSucceed();
}
//获取输入流
mInputStream = mSocket.getInputStream();
//获取输出流
mOutputStream = mSocket.getOutputStream();
while (readData) {
readMsg();
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 读取
*/
public void readMsg() {
if (mInputStream == null) return;
//缓冲区
byte[] bytes = new byte[1024];
try {
//读取客户端发送信息
int count = mInputStream.read(bytes);
if (mOnSocketServerConnectListener!=null && count>0){
//将读取信息,通知回调方法
mOnSocketServerConnectListener.onSocketMsg(new String(bytes , 0 , count));
}
Log.e(TAG, "读取到的长度为:" + count);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 发送
*
* @param msg
*/
public void writeMsg(final String msg) {
//发送信息需放到子线程
new Thread(new Runnable() {
@Override
public void run() {
if (TextUtils.isEmpty(msg)) return;
if (mOutputStream == null) return;
try {
//写入
mOutputStream.write(msg.getBytes());
//发送
mOutputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
/**
* 清除
*/
public void eliminate() {
try {
readData = false;
if (mInputStream!=null){
mInputStream.close();
}
if (mOutputStream!=null){
mOutputStream.close();
}
if (mSocket!=null){
mSocket.close();
}
if (mServerSocket != null) {
mServerSocket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public interface OnSocketServerConnectListener {
/**
* 客户端连接服务器成功回调
*/
void onSocketServerConnectSucceed();
/**
* 读取客户端信息回调
* @param msg
*/
void onSocketMsg(String msg);
}
}
客户端:
package top.weizhengzhou.tcpdemo.client;
import android.text.TextUtils;
import android.util.Log;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/**
* TCP客户端
*/
public class ClientSocket implements Runnable {
private String TAG = ClientSocket.class.getSimpleName();
private Socket mSocket;
private InputStream mInputStream;
private OutputStream mOutputStream;
private String address;
private int port;
private volatile boolean isRead = true;
private OnClientSocketListener mClientSocketListener;
public void setClientSocketListener(OnClientSocketListener clientSocketListener) {
mClientSocketListener = clientSocketListener;
}
public interface OnClientSocketListener{
void onClientSocketListener();
void onClientMsg(String msg);
}
public ClientSocket(String address, int port) {
this.address = address;
this.port = port;
}
@Override
public void run() {
try {
mSocket = new Socket(address, port);
if (mSocket==null)return;
if (mClientSocketListener!=null){
mClientSocketListener.onClientSocketListener();
}
mInputStream = mSocket.getInputStream();
mOutputStream = mSocket.getOutputStream();
while (isRead){
readMsg();
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 发送
*
* @param msg
*/
public void writeMsg(final String msg) {
new Thread(new Runnable() {
@Override
public void run() {
if (TextUtils.isEmpty(msg)) return;
if (mOutputStream == null) return;
try {
mOutputStream.write(msg.getBytes());
mOutputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
/**
* 读取
*/
public void readMsg() {
if (mInputStream == null) return;
byte[] bytes = new byte[1024];
try {
int count = mInputStream.read(bytes);
if (mClientSocketListener!=null && count>0){
mClientSocketListener.onClientMsg(new String(bytes , 0 , count));
}
Log.e(TAG, "读取到的长度为:" + count);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 清除
*/
public void eliminate() {
try {
isRead = false;
if (mInputStream!=null){
mInputStream.close();
}
if (mOutputStream!=null){
mOutputStream.close();
}
if (mSocket != null) {
mSocket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务器端界面:
package top.weizhengzhou.tcpdemo;
import android.annotation.SuppressLint;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import top.weizhengzhou.tcpdemo.server.SocketServerConnect;
public class MainActivity extends AppCompatActivity {
private SocketServerConnect mSocketServerConnect;
private TextView testserver;
private TextView ip;
private android.widget.EditText port;
private android.widget.Button openserver;
private TextView msgTv;
private String msgStr;
private TextView msg;
private EditText etserversend;
private Button bnserversend;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.bnserversend = (Button) findViewById(R.id.bn_server_send);
this.etserversend = (EditText) findViewById(R.id.et_server_send);
this.msg = (TextView) findViewById(R.id.msg);
this.msgTv = (TextView) findViewById(R.id.msg);
this.openserver = (Button) findViewById(R.id.open_server);
this.port = (EditText) findViewById(R.id.port);
this.ip = (TextView) findViewById(R.id.ip);
testserver = (TextView) findViewById(R.id.test_server);
ip.setText(getIp());
openserver.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String portStr = port.getText().toString();
if (TextUtils.isEmpty(portStr)) {
Toast.makeText(MainActivity.this, "串口不能为空", Toast.LENGTH_SHORT).show();
return;
}
mSocketServerConnect = new SocketServerConnect(Integer.valueOf(portStr));
mSocketServerConnect.setOnSocketServerConnectListener(new SocketServerConnect.OnSocketServerConnectListener() {
@Override
public void onSocketServerConnectSucceed() {
runOnUiThread(new Runnable() {
@Override
public void run() {
testserver.setText("客户端连接成功");
}
});
}
@Override
public void onSocketMsg(final String msg) {
msgStr = msgStr + msg + "\n";
runOnUiThread(new Runnable() {
@Override
public void run() {
msgTv.setText(msgStr);
}
});
}
});
new Thread(mSocketServerConnect).start();
}
});
bnserversend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String msg = etserversend.getText().toString();
if (TextUtils.isEmpty(msg))return;
if (mSocketServerConnect==null)return;
mSocketServerConnect.writeMsg(msg);
etserversend.setText("");
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mSocketServerConnect != null) {
mSocketServerConnect.eliminate();
}
}
@SuppressLint("WifiManagerLeak")
private String getIp() {
WifiManager mWifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
// 获取32位整型IP地址
int ipAddress = wifiInfo.getIpAddress();
//返回整型地址转换成“*.*.*.*”地址
return String.format("%d.%d.%d.%d",
(ipAddress & 0xff), (ipAddress >> 8 & 0xff),
(ipAddress >> 16 & 0xff), (ipAddress >> 24 & 0xff));
}
}
客户端界面:
package top.weizhengzhou.tcpdemo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import top.weizhengzhou.tcpdemo.client.ClientSocket;
public class ClientActivity extends AppCompatActivity {
private ClientSocket mClientSocket;
private android.widget.EditText textip;
private android.widget.Button textljie;
private android.widget.TextView tvstate;
private EditText etsend;
private Button bnsend;
private EditText textport;
private String msgStr;
private TextView tvclicentmsg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_client);
this.tvclicentmsg = (TextView) findViewById(R.id.tv_clicent_msg);
this.textport = (EditText) findViewById(R.id.text_port);
this.bnsend = (Button) findViewById(R.id.bn_send);
this.etsend = (EditText) findViewById(R.id.et_send);
this.tvstate = (TextView) findViewById(R.id.tv_state);
this.textljie = (Button) findViewById(R.id.text_ljie);
this.textip = (EditText) findViewById(R.id.text_ip);
textljie.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String ip = textip.getText().toString();
String port = textport.getText().toString();
if (!TextUtils.isEmpty(ip) && !TextUtils.isEmpty(port)) {
mClientSocket = new ClientSocket(ip, Integer.valueOf(port));
mClientSocket.setClientSocketListener(new ClientSocket.OnClientSocketListener() {
@Override
public void onClientSocketListener() {
runOnUiThread(new Runnable() {
@Override
public void run() {
tvstate.setText("服务器连接成功");
}
});
}
@Override
public void onClientMsg(String msg) {
msgStr = msgStr + msg + "\n";
runOnUiThread(new Runnable() {
@Override
public void run() {
tvclicentmsg.setText(msgStr);
}
});
}
});
new Thread(mClientSocket).start();
} else {
Toast.makeText(ClientActivity.this, "IP不能为空", Toast.LENGTH_SHORT).show();
}
}
});
bnsend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String msg = etsend.getText().toString();
if (TextUtils.isEmpty(msg))return;
if (mClientSocket==null)return;
mClientSocket.writeMsg(msg);
etsend.setText("");
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mClientSocket!=null){
mClientSocket.eliminate();
}
}
}