// 变量
// 线程池
private ExecutorService mThreadPool;// 为了方便展示,此处直接采用线程池进行线程管理,而没有一个个开线程
public static Socket socket;// Socket变量
/**
* 发送消息到服务器 变量
*/
// 输出流对象
public static OutputStream outputStream;
/**
* 接收服务器消息 变量
*/
public static InputStream is;// 输入流对象
// 输入流读取器对象
InputStreamReader isr;
//接受到的数据
public String response
一、登录连接
// 利用线程池直接开启一个线程 & 执行该线程
mThreadPool.execute(new Runnable() {
@Override
public void run() {
try {
// 创建Socket对象 & 指定服务端的IP 及 端口号
socket = new Socket(IP, POST);
// 判断客户端和服务器是否连接成功
booleam content = socket.isConnected();
// 步骤4:通知主线程,将接收的消息显示到界面
Message msg = Message.obtain();
msg.what = 0;
if ( content) {
msg.obj = "连接成功";
} else {
msg.obj = "连接失败";
}
mHandler.sendMessage(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
});
//用于UI操作
private void initHandler() {
// 实例化主线程,用于更新接收过来的消息
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
if (msg.obj.toString().equals("连接成功")) {
Toast.makeText(LoginFragment.this.getContext(), "登录成功!", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(LoginFragment.this.getContext(), "连接失败!", Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}
};
}
二、发送指令
mThreadPool.execute(new Runnable() {
@Override
public void run() {
try {
// 步骤1:从Socket 获得输出流对象OutputStream
// 该对象作用:发送数据
outputStream = application.socket.getOutputStream();
// 步骤2:写入需要发送的数据到输出流对象中
outputStream.write((Constant.upVoltage + "\n").getBytes("utf-8"));
// 特别注意:数据的结尾加上换行符才可让服务器端的readline()停止阻塞
// 步骤3:发送数据到服务端
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
});
三、接受信息
mThreadPool.execute(new Runnable() {
@Override
public void run() {
while (true) {
try {
// 步骤1:创建输入流对象InputStream
is = application.socket.getInputStream();
// 步骤2:创建输入流读取器对象 并传入输入流对象
// 该对象作用:获取服务器返回的数据
// isr = new InputStreamReader( is); //readlin()服务端发送的数据最后需要有空格或者回车否则接受不到
// br = new BufferedReader(isr);
步骤3:通过输入流读取器对象 接收服务器发送过来的数据
// response = br.readLine();
//字节接受数据 byte[] buffer = new byte[1000]; // 转换为字符串 int length = is.read(buffer); response = new String(buffer, 0, length); // 步骤4:通知主线程,将接收的消息显示到界面 Message msg = Message.obtain(); msg.what = 3; msg.obj = response; mHandler.sendMessage(msg); } catch (IOException e) { e.printStackTrace(); } } }// } });