PC客户端与Android服务端的Socket同步通信(2)

PC客户端与Android服务端的Socket同步通信(2)
PC客户端与Android服务端的Socket同步通信(2)

PC客户端与Android服务端的Socket同步通信(USB)

1.一个android端的service后台运行的程序,作为socket的服务器端;用于接收Pc client 端发来的命令,来处理数据后,把结果发给PC client

2.PC端程序,作为socket的客户端,用于给android手机端发操作命令

难点分析:

1.手机一定要有adb模式,即插上USB线时马上提示的对话框选adb。好多对手机的操作都可以用adb直接作。

不过,我发现LG GW880就没有,要去下载个

2.android默认手机端的IP为“127.0.0.1”

3.要想联通PC与android手机的sokcet,一定要用adb forward 来作下端口转发才能连上socket.

view plaincopy to clipboardprint?

Runtime.getRuntime().exec("adb forward tcp:12580 tcp:10086");

Thread.sleep(3000);

Runtime.getRuntime().exec("adb forward tcp:12580 tcp:10086");

Thread.sleep(3000);

4.android端的service程序Install到手机上容易,但是还要有方法来从PC的client 端来启动手机上的service ,这个办法可以通过PC端adb命令来发一个Broastcast ,手机端再写个接收BroastcastReceive来接收这个Broastcast,在这个BroastcastReceive来启动service

pc端命令:

view plaincopy to clipboardprint?

Runtime.getRuntime().exec(

"adb shell am broadcast -a NotifyServiceStart");

Runtime.getRuntime().exec(

"adb shell am broadcast -a NotifyServiceStart");

android端的代码:ServiceBroadcastReceiver.java

view plaincopy to clipboardprint?

package com.otheri.service;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.util.Log;

public class ServiceBroadcastReceiver extends BroadcastReceiver {

private static String START_ACTION = "NotifyServiceStart";

private static String STOP_ACTION = "NotifyServiceStop";

@Override

public void onReceive(Context context, Intent intent) {

Log.d(androidService.TAG, Thread.currentThread().getName() + "---->"

+ "ServiceBroadcastReceiver onReceive");

String action = intent.getAction();

if (START_ACTION.equalsIgnoreCase(action)) {

context.startService(new Intent(context, androidService.class));

Log.d(androidService.TAG, Thread.currentThread().getName() + "---->"

+ "ServiceBroadcastReceiver onReceive start end");

} else if (STOP_ACTION.equalsIgnoreCase(action)) {

context.stopService(new Intent(context, androidService.class));

Log.d(androidService.TAG, Thread.currentThread().getName() + "---->"

+ "ServiceBroadcastReceiver onReceive stop end");

}

}

}

package com.otheri.service;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.util.Log;

public class ServiceBroadcastReceiver extends BroadcastReceiver {

private static String START_ACTION = "NotifyServiceStart";

private static String STOP_ACTION = "NotifyServiceStop";

@Override

public void onReceive(Context context, Intent intent) {

Log.d(androidService.TAG, Thread.currentThread().getName() + "---->"

+ "ServiceBroadcastReceiver onReceive");

String action = intent.getAction();

if (START_ACTION.equalsIgnoreCase(action)) {

context.startService(new Intent(context, androidService.class));

Log.d(androidService.TAG, Thread.currentThread().getName() + "---->"

+ "ServiceBroadcastReceiver onReceive start end");

} else if (STOP_ACTION.equalsIgnoreCase(action)) {

context.stopService(new Intent(context, androidService.class));

Log.d(androidService.TAG, Thread.currentThread().getName() + "---->"

+ "ServiceBroadcastReceiver onReceive stop end");

}

}

}

5.由于是USB连接,所以socket就可以设计为一但连接就一直联通,即在new socket和开完out,in流后,就用个while(true){}来循环PC端和android端的读和写

android的代码:

view plaincopy to clipboardprint?

public void run() {

Log.d(androidService.TAG, Thread.currentThread().getName() + "---->"

+ "a client has connected to server!");

BufferedOutputStream out;

BufferedInputStream in;

try {

/* PC端发来的数据msg */

String currCMD = "";

out = new BufferedOutputStream(client.getOutputStream());

in = new BufferedInputStream(client.getInputStream());

// testSocket();// 测试socket方法

androidService.ioThreadFlag = true;

while (androidService.ioThreadFlag) {

try {

if (!client.isConnected()) {

break;

}

/* 接收PC发来的数据*/

Log.v(androidService.TAG, Thread.currentThread().getName()

+ "---->" + "will read......");

/* 读操作命令*/

currCMD = readCMDFromSocket(in);

Log.v(androidService.TAG, Thread.currentThread().getName()

+ "---->" + "**currCMD ==== " + currCMD);

/* 根据命令分别处理数据*/

if (currCMD.equals("1")) {

out.write("OK".getBytes());

out.flush();

} else if (currCMD.equals("2")) {

out.write("OK".getBytes());

out.flush();

} else if (currCMD.equals("3")) {

out.write("OK".getBytes());

out.flush();

} else if (currCMD.equals("4")) {

/* 准备接收文件数据*/

try {

out.write("service receive OK".getBytes());

out.flush();

} catch (IOException e) {

e.printStackTrace();

}

/* 接收文件数据,4字节文件长度,4字节文件格式,其后是文件数据*/

byte[] filelength = new byte[4];

byte[] fileformat = new byte[4];

byte[] filebytes = null;

/* 从socket流中读取完整文件数据*/

filebytes = receiveFileFromSocket(in, out, filelength,

fileformat);

// Log.v(Service139.TAG, "receive data =" + new

// String(filebytes));

try {

/* 生成文件*/

File file = FileHelper.newFile("R0013340.JPG");

FileHelper.writeFile(file, filebytes, 0,

filebytes.length);

} catch (IOException e) {

e.printStackTrace();

}

} else if (currCMD.equals("exit")) {

}

} catch (Exception e) {

// try {

// out.write("error".getBytes("utf-8"));

// out.flush();

// } catch (IOException e1) {

// e1.printStackTrace();

// }

Log.e(androidService.TAG, Thread.currentThread().getName()

+ "---->" + "read write error111111");

}

}

out.close();

in.close();

} catch (Exception e) {

Log.e(androidService.TAG, Thread.currentThread().getName()

+ "---->" + "read write error222222");

e.printStackTrace();

} finally {

try {

if (client != null) {

Log.v(androidService.TAG, Thread.currentThread().getName()

+ "---->" + "client.close()");

client.close();

}

} catch (IOException e) {

Log.e(androidService.TAG, Thread.currentThread().getName()

+ "---->" + "read write error333333");

e.printStackTrace();

}

}

public void run() {

Log.d(androidService.TAG, Thread.currentThread().getName() + "---->"

+ "a client has connected to server!");

BufferedOutputStream out;

BufferedInputStream in;

try {

/* PC端发来的数据msg */

String currCMD = "";

out = new BufferedOutputStream(client.getOutputStream());

in = new BufferedInputStream(client.getInputStream());

// testSocket();// 测试socket方法

androidService.ioThreadFlag = true;

while (androidService.ioThreadFlag) {

try {

if (!client.isConnected()) {

break;

}

/* 接收PC发来的数据*/

Log.v(androidService.TAG, Thread.currentThread().getName()

+ "---->" + "will read......");

/* 读操作命令*/

currCMD = readCMDFromSocket(in);

Log.v(androidService.TAG, Thread.currentThread().getName()

+ "---->" + "**currCMD ==== " + currCMD);

/* 根据命令分别处理数据*/

if (currCMD.equals("1")) {

out.write("OK".getBytes());

out.flush();

} else if (currCMD.equals("2")) {

out.write("OK".getBytes());

out.flush();

} else if (currCMD.equals("3")) {

out.write("OK".getBytes());

out.flush();

} else if (currCMD.equals("4")) {

/* 准备接收文件数据*/

try {

out.write("service receive OK".getBytes());

out.flush();

} catch (IOException e) {

e.printStackTrace();

}

/* 接收文件数据,4字节文件长度,4字节文件格式,其后是文件数据*/

byte[] filelength = new byte[4];

byte[] fileformat = new byte[4];

byte[] filebytes = null;

/* 从socket流中读取完整文件数据*/

filebytes = receiveFileFromSocket(in, out, filelength,

fileformat);

// Log.v(Service139.TAG, "receive data =" + new

// String(filebytes));

try {

/* 生成文件*/

File file = FileHelper.newFile("R0013340.JPG");

FileHelper.writeFile(file, filebytes, 0,

filebytes.length);

} catch (IOException e) {

e.printStackTrace();

}

} else if (currCMD.equals("exit")) {

}

} catch (Exception e) {

// try {

// out.write("error".getBytes("utf-8"));

// out.flush();

// } catch (IOException e1) {

// e1.printStackTrace();

// }

Log.e(androidService.TAG, Thread.currentThread().getName()

+ "---->" + "read write error111111");

}

}

out.close();

in.close();

} catch (Exception e) {

Log.e(androidService.TAG, Thread.currentThread().getName()

+ "---->" + "read write error222222");

e.printStackTrace();

} finally {

try {

if (client != null) {

Log.v(androidService.TAG, Thread.currentThread().getName()

+ "---->" + "client.close()");

client.close();

}

} catch (IOException e) {

Log.e(androidService.TAG, Thread.currentThread().getName()

+ "---->" + "read write error333333");

e.printStackTrace();

}

}

6.如果是在PC端和android端的读写操作来while(true){}循环,这样socket流的结尾不好判断,不能用“-1”来判断,因为“-1”是只有在socket关闭时才作为判断结尾。

7.socket在out.write(bytes);时,要是数据太大时,超过socket的缓存,socket自动分包发送,所以对方就一定要用循环来多次读。最好的办法就是服务器和客户端协议好,比如发文件时,先写过来一个要发送的文件的大小,然后再发送文件;对方用这个大小,来循环读取数据。

android端接收数据的代码:

view plaincopy to clipboardprint?

/**

* 功能:从socket流中读取完整文件数据

*

* InputStream in:socket输入流

*

* byte[] filelength: 流的前4个字节存储要转送的文件的字节数

*

* byte[] fileformat:流的前5-8字节存储要转送的文件的格式(如.apk)

*

* */

public static byte[] receiveFileFromSocket(InputStream in,

OutputStream out, byte[] filelength, byte[] fileformat) {

byte[] filebytes = null;// 文件数据

try {

int filelen = MyUtil.bytesToInt(filelength);// 文件长度从4字节byte[]转成Int

String strtmp = "read file length ok:" + filelen;

out.write(strtmp.getBytes("utf-8"));

out.flush();

filebytes = new byte[filelen];

int pos = 0;

int rcvLen = 0;

while ((rcvLen = in.read(filebytes, pos, filelen - pos)) > 0) {

pos += rcvLen;

}

Log.v(androidService.TAG, Thread.currentThread().getName()

+ "---->" + "read file OK:file size=" + filebytes.length);

out.write("read file ok".getBytes("utf-8"));

out.flush();

} catch (Exception e) {

Log.v(androidService.TAG, Thread.currentThread().getName()

+ "---->" + "receiveFileFromSocket error");

e.printStackTrace();

}

return filebytes;

}

/**

* 功能:从socket流中读取完整文件数据

*

* InputStream in:socket输入流

*

* byte[] filelength: 流的前4个字节存储要转送的文件的字节数

*

* byte[] fileformat:流的前5-8字节存储要转送的文件的格式(如.apk)

*

* */

public static byte[] receiveFileFromSocket(InputStream in,

OutputStream out, byte[] filelength, byte[] fileformat) {

byte[] filebytes = null;// 文件数据

try {

int filelen = MyUtil.bytesToInt(filelength);// 文件长度从4字节byte[]转成Int

String strtmp = "read file length ok:" + filelen;

out.write(strtmp.getBytes("utf-8"));

out.flush();

filebytes = new byte[filelen];

int pos = 0;

int rcvLen = 0;

while ((rcvLen = in.read(filebytes, pos, filelen - pos)) > 0) {

pos += rcvLen;

}

Log.v(androidService.TAG, Thread.currentThread().getName()

+ "---->" + "read file OK:file size=" + filebytes.length);

out.write("read file ok".getBytes("utf-8"));

out.flush();

} catch (Exception e) {

Log.v(androidService.TAG, Thread.currentThread().getName()

+ "---->" + "receiveFileFromSocket error");

e.printStackTrace();

}

return filebytes;

}

8.socket的最重要的机制就是读写采用的是阻塞的方式,如果客户端作为命令发起者,服务器端作为接收者的话,只有当客户端client用out.writer()写到输出流里后,即流中有数据service的read才会执行,不然就会一直停在read()那里等数据。

9.还要让服务器端可以同时连接多个client,即服务器端用new thread()来作数据读取操作。

源码:

客户端(pc端):

testPcClient.java

view plaincopy to clipboardprint?

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.BufferedReader;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import https://www.360docs.net/doc/097488368.html,.InetAddress;

import https://www.360docs.net/doc/097488368.html,.Socket;

import https://www.360docs.net/doc/097488368.html,.UnknownHostException;

public class testPcClient {

/**

* @param args

* @throws InterruptedException

*/

public static void main(String[] args) throws InterruptedException { try {

Runtime.getRuntime().exec(

"adb shell am broadcast -a NotifyServiceStop");

Thread.sleep(3000);

Runtime.getRuntime().exec("adb forward tcp:12580 tcp:10086");

Thread.sleep(3000);

Runtime.getRuntime().exec(

"adb shell am broadcast -a NotifyServiceStart");

Thread.sleep(3000);

} catch (IOException e3) {

e3.printStackTrace();

}

Socket socket = null;

try {

InetAddress serverAddr = null;

serverAddr = InetAddress.getByName("127.0.0.1");

System.out.println("TCP 1111" + "C: Connecting...");

socket = new Socket(serverAddr, 12580);

String str = "hi,wufenglong";

System.out.println("TCP 221122" + "C:RECEIVE");

BufferedOutputStream out = new BufferedOutputStream(socket

.getOutputStream());

BufferedInputStream in = new BufferedInputStream(socket

.getInputStream());

BufferedReader br = new BufferedReader(new InputStreamReader(

System.in));

boolean flag = true;

while (flag) {

System.out.print("请输入1~6的数字,退出输入exit:");

String strWord = br.readLine();// 从控制台输入1~6

if (strWord.equals("1")) {

out.write("1".getBytes());

out.flush();

System.out.println("1 finish sending the data");

String strFormsocket = readFromSocket(in);

System.out.println("the data sent by server is:\r\n"

+ strFormsocket);

System.out

.println("====================================== =======");

} else if (strWord.equals("2")) {

out.write("2".getBytes());

out.flush();

System.out.println("2 finish sending the data");

String strFormsocket = readFromSocket(in);

System.out.println("the data sent by server is:\r\n"

+ strFormsocket);

System.out

.println("====================================== =======");

} else if (strWord.equals("3")) {

out.write("3".getBytes());

out.flush();

System.out.println("3 finish sending the data");

String strFormsocket = readFromSocket(in);

System.out.println("the data sent by server is:\r\n"

+ strFormsocket);

System.out

.println("====================================== =======");

} else if (strWord.equals("4")) {

/* 发送命令*/

out.write("4".getBytes());

out.flush();

System.out.println("send file finish sending the CMD:");

/* 服务器反馈:准备接收*/

String strFormsocket = readFromSocket(in);

System.out

.println("service ready receice data:UPDA TE_CONTACTS:"

+ strFormsocket);

byte[] filebytes = FileHelper.readFile("R0013340.JPG");

System.out.println("file size=" + filebytes.length);

/* 将整数转成4字节byte数组*/

byte[] filelength = new byte[4];

filelength = tools.intToByte(filebytes.length);

/* 将.apk字符串转成4字节byte数组*/

byte[] fileformat = null;

fileformat = ".apk".getBytes();

System.out

.println("fileformat length=" + fileformat.length);

/* 字节流中前4字节为文件长度,4字节文件格式,以后是文件流*/

/* 注意如果write里的byte[]超过socket的缓存,系统自动分包写过去,所以对方要循环写完*/

out.write(filelength);

out.flush();

String strok1 = readFromSocket(in);

System.out.println("service receive filelength :" + strok1);

// out.write(fileformat);

// out.flush();

// String strok2 = readFromSocket(in);

// System.out.println("service receive fileformat :" +

// strok2);

System.out.println("write data to android");

out.write(filebytes);

out.flush();

System.out.println("*********");

/* 服务器反馈:接收成功*/

String strread = readFromSocket(in);

System.out.println(" send data success:" + strread);

System.out

.println("====================================== =======");

} else if (strWord.equalsIgnoreCase("EXIT")) {

out.write("EXIT".getBytes());

out.flush();

System.out.println("EXIT finish sending the data");

String strFormsocket = readFromSocket(in);

System.out.println("the data sent by server is:\r\n"

+ strFormsocket);

flag = false;

System.out

.println("====================================== =======");

}

}

} catch (UnknownHostException e1) {

System.out.println("TCP 331133" + "ERROR:" + e1.toString());

} catch (Exception e2) {

System.out.println("TCP 441144" + "ERROR:" + e2.toString());

} finally {

try {

if (socket != null) {

socket.close();

System.out.println("socket.close()");

}

} catch (IOException e) {

System.out.println("TCP 5555" + "ERROR:" + e.toString());

}

}

}

/* 从InputStream流中读数据*/

public static String readFromSocket(InputStream in) {

int MAX_BUFFER_BYTES = 4000;

String msg = "";

byte[] tempbuffer = new byte[MAX_BUFFER_BYTES];

try {

int numReadedBytes = in.read(tempbuffer, 0, tempbuffer.length);

msg = new String(tempbuffer, 0, numReadedBytes, "utf-8");

tempbuffer = null;

} catch (Exception e) {

e.printStackTrace();

}

// Log.v(Service139.TAG, "msg=" + msg);

return msg;

}

}

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.BufferedReader;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import https://www.360docs.net/doc/097488368.html,.InetAddress;

import https://www.360docs.net/doc/097488368.html,.Socket;

import https://www.360docs.net/doc/097488368.html,.UnknownHostException;

public class testPcClient {

/**

* @param args

* @throws InterruptedException

*/

public static void main(String[] args) throws InterruptedException { try {

Runtime.getRuntime().exec(

"adb shell am broadcast -a NotifyServiceStop");

Thread.sleep(3000);

Runtime.getRuntime().exec("adb forward tcp:12580 tcp:10086");

Thread.sleep(3000);

Runtime.getRuntime().exec(

"adb shell am broadcast -a NotifyServiceStart");

Thread.sleep(3000);

} catch (IOException e3) {

e3.printStackTrace();

}

Socket socket = null;

try {

InetAddress serverAddr = null;

serverAddr = InetAddress.getByName("127.0.0.1");

System.out.println("TCP 1111" + "C: Connecting...");

socket = new Socket(serverAddr, 12580);

String str = "hi,wufenglong";

System.out.println("TCP 221122" + "C:RECEIVE");

BufferedOutputStream out = new BufferedOutputStream(socket

.getOutputStream());

BufferedInputStream in = new BufferedInputStream(socket

.getInputStream());

BufferedReader br = new BufferedReader(new InputStreamReader(

System.in));

boolean flag = true;

while (flag) {

System.out.print("请输入1~6的数字,退出输入exit:");

String strWord = br.readLine();// 从控制台输入1~6

if (strWord.equals("1")) {

out.write("1".getBytes());

out.flush();

System.out.println("1 finish sending the data");

String strFormsocket = readFromSocket(in);

System.out.println("the data sent by server is:\r\n"

+ strFormsocket);

System.out

.println("=============================================");

} else if (strWord.equals("2")) {

out.write("2".getBytes());

out.flush();

System.out.println("2 finish sending the data");

String strFormsocket = readFromSocket(in);

System.out.println("the data sent by server is:\r\n"

+ strFormsocket);

System.out

.println("=============================================");

} else if (strWord.equals("3")) {

out.write("3".getBytes());

out.flush();

System.out.println("3 finish sending the data");

String strFormsocket = readFromSocket(in);

System.out.println("the data sent by server is:\r\n"

+ strFormsocket);

System.out

.println("=============================================");

} else if (strWord.equals("4")) {

/* 发送命令*/

out.write("4".getBytes());

out.flush();

System.out.println("send file finish sending the CMD:");

/* 服务器反馈:准备接收*/

String strFormsocket = readFromSocket(in);

System.out

.println("service ready receice data:UPDA TE_CONTACTS:"

+ strFormsocket);

byte[] filebytes = FileHelper.readFile("R0013340.JPG");

System.out.println("file size=" + filebytes.length);

/* 将整数转成4字节byte数组*/

byte[] filelength = new byte[4];

filelength = tools.intToByte(filebytes.length);

/* 将.apk字符串转成4字节byte数组*/

byte[] fileformat = null;

fileformat = ".apk".getBytes();

System.out

.println("fileformat length=" + fileformat.length);

/* 字节流中前4字节为文件长度,4字节文件格式,以后是文件流*/

/* 注意如果write里的byte[]超过socket的缓存,系统自动分包写过去,所以对方要循环写完*/

out.write(filelength);

out.flush();

String strok1 = readFromSocket(in);

System.out.println("service receive filelength :" + strok1);

// out.write(fileformat);

// out.flush();

// String strok2 = readFromSocket(in);

// System.out.println("service receive fileformat :" +

// strok2);

System.out.println("write data to android");

out.write(filebytes);

out.flush();

System.out.println("*********");

/* 服务器反馈:接收成功*/

String strread = readFromSocket(in);

System.out.println(" send data success:" + strread);

System.out

.println("=============================================");

} else if (strWord.equalsIgnoreCase("EXIT")) {

out.write("EXIT".getBytes());

out.flush();

System.out.println("EXIT finish sending the data");

String strFormsocket = readFromSocket(in);

System.out.println("the data sent by server is:\r\n"

+ strFormsocket);

flag = false;

System.out

.println("=============================================");

}

}

} catch (UnknownHostException e1) {

System.out.println("TCP 331133" + "ERROR:" + e1.toString());

} catch (Exception e2) {

System.out.println("TCP 441144" + "ERROR:" + e2.toString());

} finally {

try {

if (socket != null) {

socket.close();

System.out.println("socket.close()");

}

} catch (IOException e) {

System.out.println("TCP 5555" + "ERROR:" + e.toString());

}

}

}

/* 从InputStream流中读数据*/

public static String readFromSocket(InputStream in) {

int MAX_BUFFER_BYTES = 4000;

String msg = "";

byte[] tempbuffer = new byte[MAX_BUFFER_BYTES];

try {

int numReadedBytes = in.read(tempbuffer, 0, tempbuffer.length);

msg = new String(tempbuffer, 0, numReadedBytes, "utf-8");

tempbuffer = null;

} catch (Exception e) {

e.printStackTrace();

}

// Log.v(Service139.TAG, "msg=" + msg);

return msg;

}

}

android服务器端:

主类androidService.java

view plaincopy to clipboardprint?

package com.otheri.service;

import java.io.File;

import java.io.IOException;

import https://www.360docs.net/doc/097488368.html,.ServerSocket;

import https://www.360docs.net/doc/097488368.html,.Socket;

import android.app.Service;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

import android.os.IBinder;

import android.util.Log;

/**

* 设置:android手机

*

*

* */

public class androidService extends Service {

public static final String TAG = "TAG";

public static Boolean mainThreadFlag = true;

public static Boolean ioThreadFlag = true;

ServerSocket serverSocket = null;

final int SERVER_PORT = 10086;

File testFile;

private sysBroadcastReceiver sysBR;

@Override

public void onCreate() {

super.onCreate();

Log.v(TAG, Thread.currentThread().getName() + "---->" + " onCreate");

/* 创建内部类sysBroadcastReceiver 并注册registerReceiver */

sysRegisterReceiver();

new Thread() {

public void run() {

doListen();

};

}.start();

}

private void doListen() {

Log.d(TAG, Thread.currentThread().getName() + "---->"

+ " doListen() START");

serverSocket = null;

try {

Log.d(TAG, Thread.currentThread().getName() + "---->"

+ " doListen() new serverSocket");

serverSocket = new ServerSocket(SERVER_PORT);

boolean mainThreadFlag = true;

while (mainThreadFlag) {

Log.d(TAG, Thread.currentThread().getName() + "---->"

+ " doListen() listen");

Socket client = serverSocket.accept();

new Thread(new ThreadReadWriterIOSocket(this, client)).start();

}

} catch (IOException e1) {

Log.v(androidService.TAG, Thread.currentThread().getName()

+ "---->" + "new serverSocket error");

e1.printStackTrace();

}

}

/* 创建内部类sysBroadcastReceiver 并注册registerReceiver */

private void sysRegisterReceiver() {

Log.v(TAG, Thread.currentThread().getName() + "---->"

+ "sysRegisterReceiver");

sysBR = new sysBroadcastReceiver();

/* 注册BroadcastReceiver */

IntentFilter filter1 = new IntentFilter();

/* 新的应用程序被安装到了设备上的广播*/

filter1.addAction("android.intent.action.PACKAGE_ADDED");

filter1.addDataScheme("package");

filter1.addAction("android.intent.action.PACKAGE_REMOVED");

filter1.addDataScheme("package");

registerReceiver(sysBR, filter1);

}

/* 内部类:BroadcastReceiver 用于接收系统事件*/

private class sysBroadcastReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

String action = intent.getAction();

if (action.equalsIgnoreCase("android.intent.action.PACKAGE_ADDED")) {

// ReadInstalledAPP();

} else if (action

.equalsIgnoreCase("android.intent.action.PACKAGE_REMOVED")) { // ReadInstalledAPP();

}

Log.v(TAG, Thread.currentThread().getName() + "---->"

+ "sysBroadcastReceiver onReceive");

}

}

@Override

public void onDestroy() {

super.onDestroy();

// 关闭线程

mainThreadFlag = false;

ioThreadFlag = false;

// 关闭服务器

try {

Log.v(TAG, Thread.currentThread().getName() + "---->"

+ "serverSocket.close()");

serverSocket.close();

} catch (IOException e) {

e.printStackTrace();

}

Log.v(TAG, Thread.currentThread().getName() + "---->"

+ "**************** onDestroy****************");

}

@Override

public void onStart(Intent intent, int startId) {

Log.d(TAG, Thread.currentThread().getName() + "---->" + " onStart()");

super.onStart(intent, startId);

}

@Override

public IBinder onBind(Intent arg0) {

Log.d(TAG, " onBind");

return null;

}

}

package com.otheri.service;

同步传输与异步传输的区别

同步传输与异步传输的区别 数据块与数据块之间的时间间隔是固定的,必须严格地规定它们的时 列,标记一个数据块的开始和结束,一般还要附加一个校验序列,以 同步传输的特点:同步传输的比特分组要大得多。它不是独立地 异步传输是数据传输的一种方式。由于数据一般是一位接一位串行传输的,例如在传送一串字符信息时,每个字符代码由7位二进制位组成。但在一串二进制位中,每个7位又从哪一个二进制位开始算起呢?异步传输时,在传送每个数据字符之前,先发送一个叫做开始位的二进制位。当接收端收到这一信号时,就知道相继送来7位二进制位是一个字符数据。在这以后,接着再给出1位或2位二进制位,称做结束位。接收端收到结束位后,表示一个数据字符传送结束。这样,在异步传输时,每个字符是分别同步的,即字符中的每个二进制位是同步的,但字符与字符之间的间隙长度是不固定的。 异步传输的特点:将比特分成小组进行传送,小组可以是8位的 从不知道它们会在什么时候到达。一个常见的例子是计算机键盘与主

异步传输,英文名AsynchronousTransfer Mode,ATM,是实现B-ISDN的一项技术基础,是建立在电路交换和分组交换的基础上的快速分组交换技术。ATM的主要特点是面向连接;采用小的、固定长度的单元(53字节);取消链路的差错控制和流量控制等,这些措施提高了传输效率。。ATM 的突出优点是可以为每个虚连接提供相应的服务质量(QOS),可以有效地支持视、音频多媒体传输,包括语音、视频和数据等;另外,ATM可以实现局域网和广域网的平滑无缝连接。 [2] 异步传输一般以字符为单位,不论所采用的字符代码长度为多少位,在发送每一 异步传输 字符代码时,前面均加上一个“起”信号,其长度规定为1个码元,极性为“0”,即空号的极性;字符代码后面均加上一个“止”信号,其长度为1或者2个码元,极性皆为“1”,即与信号极性相同,加上起、止信号的作用就是为了能区分串行传输的“字符”,也就是实现了串行传输收、发双方码组或字符的同步。 综上所述,同步传输与异步传输的简单区别:1、异步传输是面向字符的传输,而同步传输是面向比特的传输。 2,异步传输的单位是字符,而同步传输的单位是帧。

Android简单的登陆界面的设计开发

通信实训报告 -Android移动平台开发 学院:信息工程学院 班级: 学号: 姓名:

实训内容: 一.1.Andriod的简介 Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。目前,最新版本为Android 2.4 Gingerbread 和Android 3.0 Honeycomb。 Android是基于Linux开放性内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统。 Android早期由原名为"Android"的公司开发,谷歌在2005年收购"Android.Inc"后,继续对Android系统开发运营,它采用了软件堆层(software stack,又名软件叠层)的架构,主要分为三部分。底层Linux内核只提供基本功能,其他的应用软件则由各公司自行开发,部分程序以Java编写。2011年初数据显示,仅正式上市两年的操作系统Android已经超越称霸十年的塞班系统,使之跃居全球最受欢迎的智能手机平台。现在,Android系统不但应用于智能手机,也在平板电脑市场急速扩张,在智能MP4方面也有较大发展。采用Android系统主要厂商包括台湾的HTC,(第一台谷歌的手机G1由HTC生产代工)美国摩托罗拉,SE等,中国大陆厂商如:魅族(M9),华为、中兴、联想、蓝魔等。 2.Android构架图 二.1软件下载 Android SDK,网址是https://www.360docs.net/doc/097488368.html,. JDK的下载地址https://www.360docs.net/doc/097488368.html,/javase/downloads/widget/jdk6.jsp。Eclipse的下载网址是https://www.360docs.net/doc/097488368.html,/downloads/ 2.Android开发环境搭建

Android客户端缓存方案

概述: 客户端缓存机制是android应用开发中非常重要的一项工作,使用缓存机制不仅仅可以为用户节省3G流量,同时在用户体验方面也是非常好的选择. 缓存机制分为两部分,一部分是文字缓存,另一部分是多媒体文件缓存. 缓存文件保存策略: 1.文字缓存: 文字缓存应该分为两种,一种是更新比较频繁的区域,一种是更新不频繁的区域. 根据两者的更新频率区分它们的过期时间. 更新比较频繁的区域,它的缓存过期时间应该为应用程序内(即应用程序从打开到关闭的这段时间).这种情况会有专门的缓存文件夹存放该类缓存文件,以及专门的缓存数据库表存放信息.每次应用程序启动的时候都会先将该类数据清空. 另一种很少更新的区域,它的缓存不设置过期时间,而是提供一个按钮或者Menu可以让用户选择手动更新(如我的好友列表,我的订阅,我的分享.等等….) 具体的文字缓存划分,详见附录1. (1)通常情况下,我们与服务器交互都是采用JSON格式获取数据的,获取的JSON数 据仅仅是一段字符串,我们可以考虑将这些字符串使用文件流写入一个TXT,保存到 SD卡中,在数据库添加该数据的记录.添加数据库记录时,提供两个关键字段,一个是 请求的URL,另一个则是本地保存后的文件地址.日后每次向服务器发起请求之前都会根据URL在数据库中检索. 该方法好处:降低系统数据库数据量,不会出现数据库满了的现象. 缺点:IO操作频繁,有时代码书写有误会造成内存泄露等状况. (2)将JSON数据解析后装入List对象中,然后遍历List,将数据统统写入相应的 数据库表结构中,以后每次向服务器发起请求之前可以先在数据库中检索,如果有直接返回. 该方法好处:如果本地存在文字缓存,那么读取缓存速度快. 缺点:增加数据库数据量. 2.多媒体文件缓存 (1)图片缓存 图片的缓存可以根据当前日期,时间为名字缓存到SD卡中的指定图片缓存目录, 同时数据库中做相应记录,记录办法可以采用两个关键字段控制,一个字段是该图片 的URL地址,另一个字段是该图片的本机地址.取图片时根据URL在数据中检索, 如果没有则连接服务器下载,下载之后再服务器中作出相应记录. (2)视频文件缓存 考虑到视频文件就是动画片,每一集的大小应该超过20MB,如果边播放边下载的话 用户的3G流量负担是很大的,而且用户看完一集动画片,基本上不会再去看第二遍. 从这个状况来看,建议不要对视频文件进行下载缓存.另外也能降低程序员的编码负 担.

同步复位和异步复位的区别

针对数字系统的设计,我们经常会遇到复位电路的设计,对初学者来说不知道同步复位与异步复位的区别与联系,今天我对这个问题简要的阐述下,希望对初学者有一定的参考意义,若有不正确的地方愿大家明示。 同步复位原理:同步复位只有在时钟沿到来时复位信号才起作用,则复位信号持续的时间应该超过一个时钟周期才能保证系统复位。 异步复位原理:异步复位只要有复位信号系统马上复位,因此异步复位抗干扰能力差,有些噪声也能使系统复位,因此有时候显得不够稳定,要想设计一个好的复位最好使用异步复位同步释放。 同步复位与异步复位的优劣:异步复位消耗的PFGA逻辑资源相对来说要少些,因此触发器自身带有清零端口不需要额外的门电路,这是其自身的优势,通常在要求不高的情况下直接使用异步复位就OK。 下面我用verilog来演示下同步复位与异步复位。 同步复位的verilog程序如下: module D_FF (

//Input ports SYSCLK, RST_B, A, //Output ports B ); //========================================= //Input and output declaration //========================================= input SYSCLK; input RST_B; input A; output B; //========================================= //Wire and reg declaration //=========================================

Android界面设计教程

这样的话就比较容易实现了,再看一下整体的Layout布局情况: xml布局文件如下:注意层次的嵌套。先是一个RelativeLayout,它有两个子布局,RelativeLayout和LinearLayout。

android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:padding="10.0dip" android:singleLine="true" android:text="设置" android:textColor="@color/white" android:textSize="15dp" />

Android客户端与服务器数据交互流程

Android客户端与服务器数据交互流程 一个门户网站的制作的流程:首先,由网页设计师只做网页设计,即画出来网站在浏览器中显示的样子,然后由前端人员编写 Html+CSS+JS来实现网站的动态效果,比如说导航栏的下拉显示,然后Ajax的局部信息更新等,然后通过后台程序如JSP,PHP, .NET等语言将数据库中的信息与前台页面相结合,这样,一个站就这样被建好了。而Android客户端,也是有UI设计师,UI前端,程序构成的,同样程序这边的话,最近Html5+CSS3的火热开启,很多公司也需要html5+css3进行Android程序的开发了。呜呜,抢我的饭碗。虽然说哥也是懂html+css的。嘿嘿,这样解释的话,可能大家不清楚,其实木有必要弄清楚网站的建站过程,这里只是给大家普及一下知识,没必要弄清楚。 基础知识:我们需要知道,Http协议是基于TCP协议的,而TCP协议是一种有连接,可靠的传输协议,如果丢失的话,会重传。所以这样的话,就不会有数据的丢失了。而Http协议有三种方法,Get,Post,Head 方法,但是用的多的只有Get和Post方法,Get方法是将请求参数放在请求头中,所以请求的参数在URL中可见,而Post方法是将请求参数放在数据部分,所以在URL中不可见,Post相对来说保密,所以在提交重要信息的时候,用的都是HttpPost方法来实现的. 而在B/S模式中,B代表浏览器,S代表服务器,在浏览器和服务器的通信之中,因为B/S之间不会一直保持连接,所以才会加入Cookie 机制,来辨认所操作的对象。用户浏览网页的操作如下:当用户点击

一个连接或者一个按钮的时候,浏览器通过发送一个请求给服务器,然后由服务器接收该请求,然后解析到用户请求的是哪些内容,然后查找到相关资源,再将数据返回给浏览器,由浏览器解析数据,然后显示给用户看到用户所需要看到的页面。所以,Android和B/S模式差不多,其实也就是发送请求,接收数据,然后解析数据,显示到手机上的过程,没什么太大的区别,谁让咱用的是互联网,用的是TCP/IP 协议呢,是吧。要理解是:所有的操作都是向服务器请求数据的过程。 hp文件,然后浏览器会将php文件解析成为html然后显示在浏览器上显示。

同步通信与异步通信区别

同步通信与异步通信区别 1.异步通信方式的特点:异步通信是按字符传输的。每传输一个字符就用起始位来进来收、发双方的同步。不会因收发双方的时钟频率的小的偏差导致错误。这种传输方式利用每一帧的起、止信号来建立发送与接收之间的同步。特点是:每帧内部各位均采用固定的时间间隔,而帧与帧之间的间隔时随即的。接收机完全靠每一帧的起始位和停止位来识别字符时正在进行传输还是传输结束。 2.同步通信方式的特点:进行数据传输时,发送和接收双方要保持完全的同步,因此,要求接收和发送设备必须使用同一时钟。优点是可以实现高速度、大容量的数据传送;缺点是要求发生时钟和接收时钟保持严格同步,同时硬件复杂。可以这样说,不管是异步通信还是同步通信都需要进行同步,只是异步通信通过传送字符内的起始位来进行同步,而同步通信采用共用外部时钟来进行同步。所以,可以说前者是自同步,后者是外同步。---------------------------- 同步通信原理 同步通信是一种连续串行传送数据的通信方式,一次通信只传送一帧信息。这里的信息帧与异步通信中的字符帧不

同,通常含有若干个数据字符。 采用同步通信时,将许多字符组成一个信息组,这样,字符可以一个接一个地传输,但是,在每组信息(通常称为帧)的开始要加上同步字符,在没有信息要传输时,要填上空字符,因为同步传输不允许有间隙。在同步传输过程中,一个字符可以对应5~8位。当然,对同一个传输过程,所 有字符对应同样的数位,比如说n位。这样,传输时,按每n位划分为一个时间片,发送端在一个时间片中发送一个字符,接收端则在一个时间片中接收一个字符。 同步传输时,一个信息帧中包含许多字符,每个信息帧用同步字符作为开始,一般将同步字符和空字符用同一个代码。在整个系统中,由一个统一的时钟控制发送端的发送和空字符用同一个代码。接收端当然是应该能识别同步字符的,当检测到有一串数位和同步字符相匹配时,就认为开始一个信息帧,于是,把此后的数位作为实际传输信息来处理。 异步通信原理 异步通信是一种很常用的通信方式。异步通信在发送字符时,所发送的字符之间的时间间隔可以是任意的。当然,

同步传输与异步传输的区别

在网络通信过程中,通信双方要交换数据,需要高度的协同工作。为了正确的解释信号,接收方必须确切地知道信号应当何时接收和处理,因此定时是至关重要的。在计算机网络中,定时的因素称为位同步。同步是要接收方按照发送方发送的每个位的起止时刻和速率来接收数据,否则会产生误差。通常可以采用同步或异步的传输方式对位进行同步处理。 1. 异步传输(Asynchronous Transmission):异步传输将比特分成小组进行传送,小组可以是8位的1个字符或更长。发送方可以在任何时刻发送这些比特组,而接收方从不知道它们会在什么时候到达。一个常见的例子是计算机键盘与主机的通信。按下一个字母键、数字键或特殊字符键,就发送一个8比特位的ASCII代码。键盘可以在任何时刻发送代码,这取决于用户的输入速度,内部的硬件必须能够在任何时刻接收一个键入的字符。 异步传输存在一个潜在的问题,即接收方并不知道数据会在什么时候到达。在它检测到数据并做出响应之前,第一个比特已经过去了。这就像有人出乎意料地从后面走上来跟你说话,而你没来得及反应过来,漏掉了最前面的几个词。因此,每次异步传输的信息都以一个起始位开头,它通知接收方数据已经到达了,这就给了接收方响应、接收和缓存数据比特的时间;在传输结束时,一个停止位表示该次传输信息的终止。按照惯例,空闲(没有传送数据)的线路实际携带着一个代表二进制1的信号,异步传输的开始位使信号变成0,其他的比特位使信号随传输的数据信息而变化。最后,停止位使信号重新变回1,该信号一直保持到下一个开始位到达。例如在键盘上数字“1”,按照8比特位的扩展ASCII编码,将发送“00110001”,同时需要在8比特位的前面加一个起始位,后面一个停止位。 异步传输的实现比较容易,由于每个信息都加上了“同步”信息,因此计时的漂移不会产生大的积累,但却产生了较多的开销。在上面的例子,每8个比特要多传送两个比特,总的传输负载就增加25%。对于数据传输量很小的低速设备来说问题不大,但对于那些数据传输量很大的高速设备来说,25%的负载增值就相当严重了。因此,异步传输常用于低速设备。 2. 同步传输(Synchronous Transmission):同步传输的比特分组要大得多。它不是独立地发送每个字符,每个字符都有自己的开始位和停止位,而是把它们组合起来一起发送。我们将这些组合称为数据帧,或简称为帧。 数据帧的第一部分包含一组同步字符,它是一个独特的比特组合,类似于前面提到的起始位,用于通知接收方一个帧已经到达,但它同时还能确保接收方的采样速度和比特的到达速度保持一致,使收发双方进入同步。 帧的最后一部分是一个帧结束标记。与同步字符一样,它也是一个独特的比特串,类似于前面提到的停止位,用于表示在下一帧开始之前没有别的即将到达的数据了。

基于Android系统的App界面设计

基于Android系统的App界面设计 智能手机时代的来临改变了大多数人的生活习惯,时至今日智能手机已经成为了人们工作生活中的一部分,在工作生活中发挥着重要的作用。App作为智能手机应用程序的核心,构建以用户体验为核心的页面设计是智能手机App设计的核心与要点,同时也是满足用户使用需求的重要途径与方式。现今的智能手机App主要分为IOS与Android两大市场,与IOS的封闭不同的是Android系统具有极强的开放性,而这一开放性在为Android系统App带来无限可能的同时也使得基于Android系统所开发的App界面本身缺乏统一的规范,从而造成基于Android系统所开发的App界面具有极大的开放性。新时期为做好基于Android 系统App的设计需要从情感、认知以及感官三个层面入手做好基于Android系统的App界面的开发设计,使之具有良好的用户使用体验。 标签:Android系统;App;界面设计 Abstract:The advent of the smart phone era has changed the habits of most people. Today,smart phone s have become a part of people’s work and life,and play an important role in the work and life. As the core of smart phone applications,App plays an important role in the work and life. The design of page based on user experience is the core and key point of the App design of smart phone,and it is also an important way and way to meet the needs of users. Today’s smartphone App is mainly divided into IOS and Android two major markets,Different from the closure of IOS,Android system has a very strong openness,and this openness not only brings infinite possibility to App of Android system,but also makes the App interface based on Android system lack of unified specification. As a result,the App interface based on Android system is very open. In order to do well the design of App based on Android system in the new period,it is necessary to develop and design the App interface based on Android system from the three aspects of emotion,cognition and sense organ,to make it have a good user experience. Keywords:Android system;App;interface design 前言 Android系统是与IOS系统所并行的应用于智能手机中的两大智能系统,在基于Android系统App界面开发的过程中受多种因素的影响使得一些App的界面具有很大的不协调性,从而影响了广大用户的使用体验。本文在分析影响智能手机App界面设计因素的基础上对如何做好基于Android系统的App界面设计进行分析阐述。 1 影响智能手机App界面设计的因素分析 智能手机App是智能手机的灵魂,用户结合自身需求可以下载安装自身所

异步传输和同步传输的区别(整理)

同步传输和异步传输的区别 在网络通信过程中,通信双方要交换数据,需要高度的协同工作。为了正确的解释信号,接收方必须确切地知道信号应当何时接收和处理,因此定时是至关重要的。在计算机网络中,定时的因素称为位同步。同步是要接收方按照发送方发送的每个位的起止时刻和速率来接收数据,否则会产生误差。通常可以采用同步或异步的传输方式对位进行同步处理。 1. 异步传输(Asynchronous Transmission):异步传输将比特分成小组进行传 送,小组可以是8位的1个字符或更长。发送方可以在任何时刻发送这些比特组,而接收方从不知道它们会在什么时候到达。一个常见的例子是计算机键盘与主机的通信。按下一个字母键、数字键或特殊字符键,就发送一个8比特位的ASCII代码。键盘可以在任何时刻发送代码,这取决于用户的输入速度,内部的硬件必须能够在任何时刻接收一个键入的字符。 异步传输存在一个潜在的问题,即接收方并不知道数据会在什么时候到达。在它检测到数据并做出响应之前,第一个比特已经过去了。这就像有人出乎意料地从后面走上来跟你说话,而你没来得及反应过来,漏掉了最前面的几个词。因此,每次异步传输的信息都以一个起始位开头,它通知接收方数据已经到达了,这就给了接收方响应、接收和缓存数据比特的时间;在传输结束时,一个停止位表示该次传输信息的终止。按照惯例,空闲(没有传送数据)的线路实际携带着一个代表二进制1的信号,异步传输的开始位使信号变成0,其他的比特位使信号随传输的数据信息而变化。最后,停止位使信号重新变回1,该信号一直保持到下一个开始位到达。例如在键盘上数字“1”,按照8比特位的扩展ASCII编码,将发送“00110001”,同时需要在8比特位的前面加一个起始位,后面一个停止位。 异步传输的实现比较容易,由于每个信息都加上了“同步”信息,因此计时的漂移不会产生大的积累,但却产生了较多的开销。在上面的例子,每8个比特要多传送两个比特,总的传输负载就增加25%。对于数据传输量很小的低速设备来说问题不大,但对于那些数据传输量很大的高速设备来说,25%的负载增值就相当严重了。因此,异步传输常用于低速设备。 2. 同步传输(Synchronous Transmission):同步传输的比特分组要大得多。它 不是独立地发送每个字符,每个字符都有自己的开始位和停止位,而是把它们组合起来一起发送。我们将这些组合称为数据帧,或简称为帧。 数据帧的第一部分包含一组同步字符,它是一个独特的比特组合,类似于前面提到的起始位,用于通知接收方一个帧已经到达,但它同时还能确保接收方的采样速度和比特的到达速度保持一致,使收发双方进入同步。 帧的最后一部分是一个帧结束标记。与同步字符一样,它也是一个独特的比特串,类似于前面提到的停止位,用于表示在下一帧开始之前没有别的即将到达的数据了。

Android客户端与服务器数据交互流程

A n d r o i d客户端与服务器数 据交互流程 标准化文件发布号:(9312-EUATWW-MWUB-WUNN-INNUL-DQQTY-

Android客户端与服务器数据交互流程 一个门户网站的制作的流程:首先,由网页设计师只做网页设计,即画出来网站在浏览器中显示的样子,然后由前端人员编写 Html+CSS+JS来实现网站的动态效果,比如说导航栏的下拉显示,然后Ajax的局部信息更新等,然后通过后台程序如JSP,PHP, .NET等语言将数据库中的信息与前台页面相结合,这样,一个站就这样被建好了。而Android客户端,也是有UI设计师,UI前端,程序构成的,同样程序这边的话,最近Html5+CSS3的火热开启,很多公司也需要html5+css3进行Android程序的开发了。呜呜,抢我的饭碗。虽然说哥也是懂html+css的。嘿嘿,这样解释的话,可能大家不清楚,其实木有必要弄清楚网站的建站过程,这里只是给大家普及一下知识,没必要弄清楚。 基础知识:我们需要知道,Http协议是基于TCP协议的,而TCP协议是一种有连接,可靠的传输协议,如果丢失的话,会重传。所以这样的话,就不会有数据的丢失了。而Http协议有三种方法,Get,Post,Head方法,但是用的多的只有Get和Post方法,Get方法是将请求参数放在请求头中,所以请求的参数在URL中可见,而Post方法是将请求参数放在数据部分,所以在URL中不可见,Post 相对来说保密,所以在提交重要信息的时候,用的都是HttpPost方法来实现的. 而在B/S模式中,B代表浏览器,S代表服务器,在浏览器和服务器的通信之中,因为B/S之间不会一直保持连接,所以才会加入

同步通信与异步通信有何不同

同步通信与异步通信有何不同? 串口通信可以分为同步通信和异步通信两类。同步通信是按照软件识别同步字符来实现数据的发送和接收,异步通信是一种利用字符的再同步技术的通信方式。 同步通信 同步通信是一种连续串行传送数据的通信方式,一次通信只传送一帧信息。这里的信息帧与异步通信中的字符帧不同,通常含有若干个数据字符。如图: 单同步字符帧结构 +-----+------+-------+------+-----+--------+-------+-------+ |同步|数据|数据|数据| ... |数据|CRC1|CRC2| |字符|字符1|字符2|字符3| |字符N| | | +-----+------+-------+------+-----+--------+-------+-------+ 双同步字符帧结构 +-----+--------+------+-------+---+-------+-------+--------+ |同步|同步|数据|数据| ... |数据|CRC1|CRC2| |字符1|字符2|字符1|字符2| |字符N| | | +-----+--------+------+-------+---+-------+-------+--------+ 它们均由同步字符、数据字符和校验字符(CRC)组成。其中同步

字符位于帧开头,用于确认数据字符的开始。数据字符在同步字符之后,个数没有限制,由所需传输的数据块长度来决定;校验字符有1到2个,用于接收端对接收到的字符序列进行正确性的校验。 同步通信的缺点是要求发送时钟和接收时钟保持严格的同步。 异步通信 异步通信中,数据通常以字符或者字节为单位组成字符帧传送。字符帧由发送端逐帧发送,通过传输线被接收设备逐帧接收。发送端和接收端可以由各自的时钟来控制数据的发送和接收,这两个时钟源彼此独立,互不同步。 接收端检测到传输线上发送过来的低电平逻辑"0"(即字符帧起始位)时,确定发送端已开始发送数据,每当接收端收到字符帧中的停止位时,就知道一帧字符已经发送完毕。 在异步通行中有两个比较重要的指标:字符帧格式和波特率。 (1)字符帧,由起始位、数据位、奇偶校验位和停止位组成。如图: 无空闲位字符帧 +--+---+---+---+---+--+--+--+--+--+--+--+---+---+---+--+--+ |D7|0/1| 1 | 0 |D0|D1|D2|D3|D4|D5|D6|D7|0/1| 1 | 0 |D0|D1| +--+---+---+---+--+--+--+--+--+--+--+--+---+---+---+--+--+ 奇偶停起奇偶停起 校验止始校验止始 位位位位

Android的UI设计

UI设计9要素: Do: ◆为高分辨率的屏幕创建资源(缩小总比放大好) ◆需要点击的元素要够大 ◆图标设计遵循 Android 的准则 ◆使用适当的间距(margins, padding) ◆支持D-pad和trackball导航 ◆正确管理活动(activity)堆栈 ◆正确处理屏幕方向变化 ◆使用主题/样式,尺寸和颜色资源来减少多余的值 ◆和视觉交互设计师合作! UI设计5不要 Don’t: ◆不要照搬你在其它平台的UI设计,应该让用户感觉是在真正使用一个 Android 软件,在你的商标显示和平台整体观感之间做好平衡 ◆不要过度使用模态对话框 ◆不要使用固定的绝对定位的布局 ◆不要使用px单位,使用dp或者为文本使用sp ◆不要使用太小的字体 4则Android UI的设计哲学: ◆干净而不过于简单 ◆关注内容而非修饰 ◆保存一致,让用户容易投入其中,可附加少许变化 ◆使用云端服务(存储和同步用户资料)来加强用户体验 优秀界面的设计5条准则: ◆关注用户 ◆显示正确的内容 ◆给予用户适当的回馈

◆有章可循的行为模式 ◆容忍错误 设计需要考量的8地方: ◆屏幕的物理尺寸 ◆屏幕密度 ◆屏幕的方向(竖向和横向) ◆主要的UI交互方式(触屏还是使用D-pad/trackball) ◆软键盘还是物理键盘 ◆了解不同设备之间的相异之处是非常重要的! ◆阅读CDD,学习设备可能差异的地方 ◆了解屏幕尺寸和密度分类 TextView重要属性: RelativeLayout用到的一些重要的属性: 第一类:属性值为true或false android:layout_centerHrizontal 水平居中 android:layout_centerVertical 垂直居中 android:layout_centerInparent 相对于父元素完全居中 android:layout_alignParentBottom 贴紧父元素的下边缘 android:layout_alignParentLeft 贴紧父元素的左边缘 android:layout_alignParentRight 贴紧父元素的右边缘 android:layout_alignParentTop 贴紧父元素的上边缘 android:layout_alignWithParentIfMissing 如果对应的兄弟元素找不到的话就以父元素做参照物 第二类:属性值必须为id的引用名“@id/id-name” android:layout_below在某元素的下方 android:layout_above 在某元素的的上方 android:layout_toLeftOf 在某元素的左边 android:layout_toRightOf 在某元素的右边 android:layout_alignTop 本元素的上边缘和某元素的的上边缘对齐 android:layout_alignLeft 本元素的左边缘和某元素的的左边缘对齐 android:layout_alignBottom 本元素的下边缘和某元素的的下边缘对齐 android:layout_alignRight 本元素的右边缘和某元素的的右边缘对齐 第三类:属性值为具体的像素值,如30dip,40px android:layout_marginBottom 离某元素底边缘的距离

移动客户端Android开发规范

移动客户端开发规范之Android 一、编码规范 (1)常量命名:只能包含字母和_,字母全部大写,单词之间用_隔开。 单词名称要能体现变量的逻辑说明。 (2)变量命名:变量类型简称+变量逻辑名称 变量类型:String=str;Integer=int;Boolean=bool; (3)控件命名:控件类型简称+逻辑名称 控件类型:LayoutView:lv RelativeView:rv Button:btn TextView:tv ImageView:iv EditText:et …………… (4)Activity命名及对应的页面命名 Activity命令:逻辑名称(首字母大写)+Activity 页面命令:逻辑名称(小写,跟Activity的逻辑名称同名,单词间用_分隔)+.xml (5)Strings.xml中的id命名 对于针对特定Actvity命名:activity名称_逻辑名称(小写) 其它命名:strings_逻辑名称(小写) (6)包的命名 规则:com.al.ec+.应用程序名称+.目录分类(全部小写)

二、版本控制 (1)采用代码管理工具,进行代码的管理。如:SVN 代码在完成一个大版本的时候,需对此大版本打标签,以方便下次可以快速取出代码。 代码提示,需注明开发或修改了什么内容。 (2)程序的文件头注释按以下格式 /** * 亚信联创电信EC产品部 * * @author翁德辉 * @date 2012-04-05 * @Description: 基类,用于集合页面的常用操作 * @version V1.0 */ 如果有修改需在其下面写明修改日期,修改人,修改内容。 (3)函数或过程的注释按以下格式 /** * 函数或过程说明 * * @param参数名:参数说明 */ (4)对于变量需要在变量上面对变量进行注解。 // 弹出选号 private AlertDialog dialogNumber = null; (5)在eclipse进行开发当中,可以使用Ctrl+Shit+F对代码按格式排版 可以使用CTRL+SHIFT+O对不需要的引用类进行去除。

android UI界面设计

Android UI开发专题(一) 之界面设计 发帖日期:2010-02-09 10:49:28 标签:ophone 近期很多网友对Android用户界面的设计表示很感兴趣,对于Android UI开发自绘控件和游戏制作而言掌握好绘图基础是必不可少的。本次专题分10节来讲述,有关OpenGL ES相关的可能将放到以后再透露。本次主要涉及以下四个包的相关内容: android.content.res 资源类 android.graphics 底层图形类 android.view 显示类 android.widget 控件类 一、android.content.res.Resources 对于Android平台的资源类android.content.res.Resources可能很多网友比较陌生,一起来看看SDK上是怎么介绍的吧,Contains classes for accessing application resources, such as raw asset files, colors, drawables, media or other other files in the package, plus important device configuration details (orientation, input types, etc.) that affect how the application may behave.平时用到的二进制源文件raw、颜色colors、图形drawables和多媒体文件media的相关资源均通过该类来管理。 int getColor(int id) 对应res/values/colors.xml Drawable getDrawable(int id) 对应res/drawable/ XmlResourceParser getLayout(int id) 对应res/layout/ String getString(int id) 和CharSequence getText(int id) 对应 res/values/strings.xml InputStream openRawResource(int id) 对应res/raw/ void parseBundleExtra (String tagName, AttributeSet attrs, Bundle outBundle) 对应res/xml/ String[] getStringArray(int id) res/values/arrays.xml float getDimension(int id) res/values/dimens.xml 二、android.graphics.Bitmap 作为位图操作类,Bitmap提供了很多实用的方法,常用的我们总结如下: boolean compress(https://www.360docs.net/doc/097488368.html,pressFormat format, int quality, OutputStream stream) 压缩一个Bitmap对象根据相关的编码、画质保存到一个OutputStream中。其中第一个压缩格式目前有JPG和PNG void copyPixelsFromBuffer(Buffer src) 从一个Buffer缓冲区复制位图像素

一步步教你为网站开发Android客户端

一步步教你为网站开发Android客户端 注:本文来自友盟-安卓巴士教程大赛第一名获奖作品,作者安卓巴士的ID为liupeinye。推荐给所有刚刚开始接触Android开发的朋友们! 本文面向Android初级开发者,有一定的Java和Android知识即可。 文章覆盖知识点:HttpWatch抓包,HttpClient模拟POST请求,Jsoup解析HTML代码,动态更新ListView 背景介绍:客户端(Client)或称为用户端,是指与服务器相对应,为客户提供本地服务的程序。而android 系统上的90%客户端软件都有一个共性,就是为了改善网页在android系统上体验不佳而生,最具有影响力的软件有:新浪微博、人人网、淘宝等,这类软件最突出的特点就是,先有网站再有软件。由于网络技术发展的多样性,手机浏览器往往无法跟随它的步伐,为改善用户体验,网站客户端软件印运而生。 以下内容100%原创,并在安卓巴士论坛首发,如需转载,请注明作者和出处。谢谢合作。 开发Android网站客户端通常有两种方法:第一种,通过服务端的开放平台,调用提供的API接口来开发,比如说open sina;第二种,服务端没有提供任何接口,你也没有服务端任何数据库访问权限,就是一个纯纯粹粹的网站,要你做客户端。今天,我要和大家分享的正是第二种情况。 这是一个简单的示意图,告诉我们,数据是由网页从数据库中取出,我们要为这个系统做客户端,我们就应该这样去改造它。

通过这样间接的方法来访问数据库,只要网页能看到的内容,我们的客户端都能获取到,而UI是由你自行制作,就可以使使用体验上一个台阶。 既然网页是我们的数据枢纽,我们就从网页分析着手。 该教程来自本人项目-掌上民大-真实经验,所以用项目中的”掌上图书馆”板块来示范。 该项目任务为中南民族大学图书馆图书查询功能制作客户端。 首先打开该网址https://www.360docs.net/doc/097488368.html,/,我们会看到主界面

异步通信同步通信区别

异步通信”是一种很常用的通信方式。异步通信在发送字符时,所发送的字符之间的时间间隔可以是任意的。当然,接收端必须时刻做好接收的准备(如果接收端主机的电源都没有加上,那么发送端发送字符就没有意义,因为接收端根本无法接收)。发送端可以在任意时刻开始发送字符,因此必须在每一个字符的开始和结束的地方加上标志,即加上开始位和停止位,以便使接收端能够正确地将每一个字符接收下来。异步通信的好处是通信设备简单、便宜,但传输效率较低(因为开始位和停止位的开销所占比例较大)。 异步通信也可以是以帧作为发送的单位。接收端必须随时做好接收帧的准备。这是,帧的首部必须设有一些特殊的比特组合,使得接收端能够找出一帧的开始。这也称为帧定界。帧定界还包含确定帧的结束位置。这有两种方法。一种是在帧的尾部设有某种特殊的比特组合来标志帧的结束。或者在帧首部中设有帧长度的字段。需要注意的是,在异步发送帧时,并不是说发送端对帧中的每一个字符都必须加上开始位和停止位后再发送出去,而是说,发送端可以在任意时间发送一个帧,而帧与帧之间的时间间隔也可以是任意的。在一帧中的所有比特是连续发送的。发送端不需要在发送一帧之前和接收端进行协调(不需要先进行比特同步)。每个字符开始发送的时间可以是任意的t0 0 1 1 0 1 1 0起始位结束位t每个帧开始发送的时间可以是任意的以字符为单位发送以帧为单位发送帧开始帧结束 “同步通信”的通信双方必须先建立同步,即双方的时钟要调整到同一个频率。收发双方不停地发送和接收连续的同步比特流。但这时还有两种不同的同步方式。一种是使用全网同步,用一个非常精确的主时钟对全网所有结点上的时钟进行同步。另一种是使用准同步,各结点的时钟之间允许有微小的误差,然后采用其他措施实现同步传输。 同步方式是在传送一组字符前加入1个或2个同步字符SYN。同步字符后可以连续改善任意多个字符,每个字符间不需要附加位。故此传输方法效率较高,但双方要事先约定同步的字符个数及同步字符代码,且中间传输有停顿时会失去同步,造成传输错误。 串行通信是指计算机主机与外设之间以及主机系统与主机系统之间数据的串行传送。使用串口通信时,发送和接收到的每一个字符实际上都是一次一位的传送的,每一位为1或者为0。 串行通信的分类 串行通信可以分为同步通信和异步通信两类。同步通信是按照软件识别同步字符来实现数据的发送和接收,异步通信是一种利用字符的再同步技术的通信方式。 同步通信 同步通信是一种连续串行传送数据的通信方式,一次通信只传送一帧信息。这里的信息帧与异步通信中的字符帧不同,通常含有若干个数据字符。 它们均由同步字符、数据字符和校验字符(CRC)组成。其中同步字符位于帧开头,用于确认数据字符的开始。数据字符在同步字符之后,个数没有限制,由所需传输的数据块长度来决定;校验字符有1到2个,用于接收端对接收到的字符序列进行正确性的校验。同步通信的缺点是要求发送时钟和接收时钟保持严格的同步。 异步通信 异步通信中,在异步通行中有两个比较重要的指标:字符帧格式和波特率。数据通常以字符或者字节为单位组成字符帧传送。字符帧由发送端逐帧发送,通过传输线被接收设备逐帧接收。发送端和接收端可以由各自的时钟来控制数据的发送和接收,这两个时钟源彼此独立,互不同步。 接收端检测到传输线上发送过来的低电平逻辑"0"(即字符帧起始位)时,确定发送端已开

相关文档
最新文档