权限
//网络权限
<uses-permission android:name="android.permission.INTERNET"/>
服务器线程封装类
package com.example.thrdemo;
import android.util.Log;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* Created by yk on 2018/7/11.
*/
public class ServerThread extends Thread {
private final String TAG = "ServerThread";
private ServerSocket serverSocket;
private boolean isServerRuning = false; //服务器是否在运行
public Map<String, SocketThread> socketThreadMap = new HashMap<>(); //客户端列表 ip:端口,客户端
private int port = 0;
public ServerThread(int port) {
this.port = port;
}
public void start() {
try {
serverSocket = new ServerSocket(port);
isServerRuning = true;
super.start();
Log.e(TAG, "服务器运行成功");
} catch (IOException e) {
e.printStackTrace();
isServerRuning = false;
Log.e(TAG, "服务器运行失败");
}
}
@Override
public void interrupt() {
isServerRuning = false;
if (socketThreadMap != null) {
Log.e(TAG, "客户端个数:" + socketThreadMap.size());
Iterator<String> iterator = socketThreadMap.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next();
socketThreadMap.get(key).interrupt();
}
socketThreadMap.clear();
socketThreadMap = null;
}
Log.e(TAG, "客户端资源释放完毕");
//关闭服务器
if (serverSocket != null) {
try {
serverSocket.close();
serverSocket = null;
} catch (IOException e) {
e.printStackTrace();
}
}
Log.e(TAG, "关闭服务器完毕");
super.interrupt();
}
//获取服务器是否在运行
public boolean isServerRuning() {
return isServerRuning;
}
@Override
public void run() {
super.run();
while (isServerRuning()) {
try {
Socket socket = serverSocket.accept(); //等待客户端连接
Log.e(TAG, "有客户端连接上:" + socket.toString());
if (socket != null) {
SocketThread socketThread = new SocketThread(socket);
socketThread.start();
socketThreadMap.put(socket.getInetAddress() + ":" + socket.getPort(), socketThread);
if (iWifiRec != null)
iWifiRec.onRecWifiDataCom(socket, null, 0);
}
} catch (IOException e) {
// e.printStackTrace();
}
}
}
//客户端线程
class SocketThread extends Thread {
Socket socket;
InputStream inputStream;
String key = "";
public SocketThread(Socket socket) {
key = socket.getInetAddress() + ":" + socket.getPort();
this.socket = socket;
}
@Override
public void interrupt() {
if (socket != null) {
try {
socket.close();
socket = null;
} catch (IOException e) {
e.printStackTrace();
}
}
if (inputStream != null) {
try {
inputStream.close();
inputStream = null;
} catch (IOException e) {
e.printStackTrace();
}
}
try {
this.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
super.interrupt();
}
@Override
public void run() {
super.run();
while (socket != null && !socket.isClosed()) {
try {
Thread.sleep(100);
// sendByte("".getBytes());
} catch (InterruptedException e) {
// e.printStackTrace();
}
if (socket != null && !socket.isClosed()) {
try {
inputStream = socket.getInputStream();
int num = inputStream.available();
byte[] buff = new byte[num];
int ret = inputStream.read(buff);
if (ret > 0) {
if (iWifiRec != null)
iWifiRec.onRecWifiDataCom(socket, buff, ret);
}
} catch (IOException e) {
// e.printStackTrace();
Log.e(TAG, "客户端已断开:" + socket);
this.interrupt();
}
}
}
}
}
//客户端接口
public interface IWifiRec {
/*-------------------------------------------------------------------------------
1、名称:onRecDataCom
2、参数:socket 客户端
buffer 客户端接收数据
int 客户端接收长度
3、返回值:
void
/********************************************************************************/
void onRecWifiDataCom(Socket socket, byte[] buffer, int len);
}
private IWifiRec iWifiRec;
public void setiWifiRec(IWifiRec iWifiRec) {
this.iWifiRec = iWifiRec;
}
}