一、socket通讯原理
socket的话,大家可以参考这篇文章,写的比较全面,顺便复习了计算机基础的通讯原理(PS大学的基础课程很有价值的,且听且珍惜)我就不重复造轮子了zzz....;
https://blog.csdn.net/lixpjita39/article/details/77585247
二、建立service端
package home.gz.com.wifiandsocket;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.support.annotation.Nullable;
import android.util.Log;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* @author Wudi
* @date 2018/10/31
*/
public class SocketService extends Service {
/**
* 是否运行
*/
private boolean isRunning;
private SocketServiceThread socketServiceThread;
private List<Socket> socketList = new ArrayList<>();
@Override
public void onCreate() {
isRunning = true;
}
@Override
public void onDestroy() {
socketServiceThread.onStop();
isRunning = false;
socketList.clear();
super.onDestroy();
}
private ServerSocket serverSocket;
private Handler serHandler;
public Handler sendHandler;
public void onStart(Handler handler) {
this.serHandler = handler;
try {
serverSocket = new ServerSocket(3000);
} catch (IOException e) {
e.printStackTrace();
}
new Thread(new Runnable() {
@Override
public void run() {
while (isRunning) {
try {
// 等待客户端连接,获取套接字
Socket socket = serverSocket.accept();
socketList.add(socket);
// 每当客户端连接后启动一天线程为其服务
socketServiceThread = new SocketServiceThread(socket);
new Thread(socketServiceThread).start();
Looper.prepare();
sendHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 5) {
for (Iterator<Socket> socketIterator = socketList.iterator(); socketIterator.hasNext(); ) {
Socket inSocket = socketIterator.next();
Log.d("信息", inSocket.toString());
try {
OutputStream outputStream = inSocket.getOutputStream();
outputStream.write(((String) msg.obj.toString()).getBytes("utf-8"));
} catch (IOException e) {
e.printStackTrace();
socketIterator.remove();
}
}
}
}
};
Looper.loop();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new LocalBinder();
}
private class SocketServiceThread implements Runnable {
private Socket mSocket;
/**
* 该线程所处理Socket对应的输入流
*/
private BufferedReader mBufferedReader;
private boolean isStop;
public SocketServiceThread(Socket mSocket) {
this.mSocket = mSocket;
this.isStop = false;
try {
mBufferedReader = new BufferedReader(new InputStreamReader(mSocket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
readStream(mSocket.getInputStream());
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 读取流
*
* @param inStream
* @return 字节数组
* @throws Exception
*/
public void readStream(InputStream inStream) throws Exception {
String content = "";
ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
byte[] buffer = new byte[2048 * 2];
int len = -1;
while ((len = inStream.read(buffer)) != -1) {
outSteam.write(buffer, 0, len);
content = outSteam.toString();
Log.d("收到的消息", content);
Message message = new Message();
message.what = 4;
message.obj = content;
serHandler.sendMessage(message);
}
outSteam.close();
inStream.close();
}
/**
* 读取客户端数据
*
* @return
*/
private String readFromClient() {
try {
return mBufferedReader.readLine();
} catch (IOException e) {
// 捕获到异常,对应的客户端已经关闭
e.printStackTrace();
// 移除该socket
socketList.remove(mSocket);
}
return null;
}
public void onStop() {
isStop = true;
try {
mBufferedReader.close();
mSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class LocalBinder extends Binder {
public SocketService getSocketService() {
return SocketService.this;
}
}
}
三、建立Client端
package home.gz.com.wifiandsocket;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.SocketTimeoutException;
/**
* @author Wudi
* @date 2018/10/31
*/
public class SocketClientThread implements Runnable {
private Socket socket;
/**
* 发送处理
*/
public Handler sendHandler;
/**
* 接受处理
*/
private Handler recHandler;
private BufferedReader bufferedReader;
private OutputStream outputStream;
private boolean isStop = false;
private String ip;
public SocketClientThread(String ip, Handler recHandler) {
this.recHandler = recHandler;
this.ip = ip;
}
@Override
public void run() {
while (true) {
try {
socket = new Socket(ip, 3000);
bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
outputStream = socket.getOutputStream();
// 开启子线程读取服务器数据
new Thread(new Runnable() {
@Override
public void run() {
try {
readStream(socket.getInputStream());
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
Looper.prepare();
sendHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 2) {
try {
outputStream.write((msg.obj.toString() + "\n").getBytes("utf-8"));
} catch (IOException e) {
e.printStackTrace();
}
}
}
};
Looper.loop();
} catch (SocketTimeoutException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 读取流
*
* @param inStream
* @return 字节数组
* @throws Exception
*/
public void readStream(InputStream inStream) throws Exception {
String content = "";
ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
byte[] buffer = new byte[2048 * 2];
int len = -1;
while ((len = inStream.read(buffer)) != -1) {
outSteam.write(buffer, 0, len);
content = outSteam.toString();
Log.d("收到的消息", content);
// 读取数据
Message message = new Message();
message.what = 1;
message.obj = content;
recHandler.sendMessage(message);
}
outSteam.close();
inStream.close();
}
public void onStop() {
isStop = true;
try {
bufferedReader.close();
outputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
这里要注意的就是跟IOS通讯的时候必须采用utf-8国际编码,同时用字节流读取,如果仅仅是java端互通的话
可以采用用字符流读取
- 字节流读取
/**
* 读取流
*
* @param inStream
* @return 字节数组
* @throws Exception
*/
public void readStream(InputStream inStream) throws Exception {
String content = "";
ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
byte[] buffer = new byte[2048 * 2];
int len = -1;
while ((len = inStream.read(buffer)) != -1) {
outSteam.write(buffer, 0, len);
content = outSteam.toString();
Log.d("收到的消息", content);
// 读取数据
Message message = new Message();
message.what = 1;
message.obj = content;
recHandler.sendMessage(message);
}
outSteam.close();
inStream.close();
}
- 字符流读取
InputStream inputStream = socket.getInputStream();
InputStreamReader inputStreamReader =new InputStreamReader(inputStream);
BufferedReader bufferedReader =new BufferedReader(inputStreamReader);
String info =null;
while((info=bufferedReader.readLine())!=null){
System.out.println("我是服务器,客户端说:"+info);
}
socket.shutdownInput();//关闭输入流
//4、获取输出流,响应客户端的请求
OutputStream outputStream = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
pw.write("欢迎您!");
pw.flush();