android端和pc端使用usb进行socket通信,其中android是服务器端,pc是客户端。如何实现安卓端输入的数据通过按钮发送到pc端?

部分源码如下:

主类androidService.java


/**
 * 设置: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;
}

}
用于新socket连接的读写线程类ThreadReadWriterIOSocket.java
package com.otheri.service;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

import android.content.Context;
import android.util.Log;

import com.otheri.util.FileHelper;
import com.otheri.util.MyUtil;

/**
 * 功能:用于socket的交互
 * 
 * @author wufenglong
 * 
 */
public class ThreadReadWriterIOSocket implements Runnable {
private Socket client;
private Context context;

ThreadReadWriterIOSocket(Context context, Socket client) {

this.client = client;
this.context = context;
}

@Override
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("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();
}
}
}
//功能:从socket流中读取完整文件数据
}
}
testPcClient.java
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 java.net.InetAddress;
import java.net.Socket;
import java.net.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("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:UPDATE_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("=============================================");

}
}
/* 从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;
}
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的示例代码,使用RSA和AES实现客户端服务器端之间的加密通信: 1. 生成RSA密钥对 ```java KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(2048); KeyPair keyPair = keyGen.generateKeyPair(); PrivateKey privateKey = keyPair.getPrivate(); PublicKey publicKey = keyPair.getPublic(); ``` 2. 客户端使用服务器公钥加密AES密钥,并发送给服务器 ```java // 生成AES密钥 KeyGenerator keyGen = KeyGenerator.getInstance("AES"); keyGen.init(256); SecretKey secretKey = keyGen.generateKey(); // 使用服务器公钥加密AES密钥 Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.ENCRYPT_MODE, serverPublicKey); byte[] encryptedKey = cipher.doFinal(secretKey.getEncoded()); // 发送加密后的AES密钥给服务器 OutputStream outputStream = socket.getOutputStream(); outputStream.write(encryptedKey); outputStream.flush(); ``` 3. 服务器端接收加密后的AES密钥,使用私钥解密 ```java // 接收加密后的AES密钥 InputStream inputStream = socket.getInputStream(); byte[] encryptedKey = new byte[256]; inputStream.read(encryptedKey); // 使用私钥解密AES密钥 Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] decryptedKey = cipher.doFinal(encryptedKey); SecretKey secretKey = new SecretKeySpec(decryptedKey, "AES"); ``` 4. 客户端服务器端使用AES密钥加密和解密通信数据 ```java // 客户端加密通信数据 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] encryptedData = cipher.doFinal(data); // 服务器端解密通信数据 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, secretKey); byte[] decryptedData = cipher.doFinal(encryptedData); ``` 注意:以上代码仅为示例,实际使用时需要考虑更多的安全性和性能方面的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值